Enciclopedia de Conocimientos Fundamentales
UNAM ˜ SIGLO XXI


regreso








3.3.4 Recorriendo listas

Con procedimientos, como los que se han visto hasta el momento, es muy sencillo recorrer listas; sin embargo, el patrón de recorrido es tan común que Scheme ofrece un procedimiento muy efectivo para procesar listas: map. Lo que hace map es aprovechar que en Scheme los procedimientos son de alto nivel y entonces pueden utilizarse como argumentos. La forma general de map es la siguiente:

map procedimiento lista)

que aplica el procedimiento a cada uno de los elementos de la lista, de manera consecutiva, y almacena los resultados en una nueva lista, que es su valor de regreso. Los siguientes son algunos ejemplos con map; el primero suma 5 a cada uno de los números en la lista:

<(define (suma-5 n)

(+ 5 n))

> (map suma-5 '(1 2 3 4 5))

(6 7 8 9 10)

El siguiente ejemplo multiplica por dos cada número:

(define (x-2 n)

(* n 2))

> (map x-2 '(1 2 3 4 5))

(2 4 6 8 10)

Una tarea interesante es filtrar el contenido de las listas. Por ejemplo, ¿cómo hacer para quedarse con todos los números pares o los impares? Hay que recordar que Scheme tiene las primitivas even? y odd?, así que manos a la obra: en este caso se va a programar un procedimiento que se llama filtro, que recibe un predicado y una lista y regresa otralista que tiene a todos los elementos para los que el predicado regresa #t.

;; Contrato: predicado lista -> lista

;; Propósito: una lista con todos los elementos

;; para los que el predicado regresa #t.

;; Ejemplos: (filtro odd? '(1 2 3 4 5))

;; debe producir (1 3 5)v

;; Procedimiento:

(define (filtro pred lista)

(cond ((empty? lista) '())v

((pred (first lista))

(cons (first lista)

(filtro pred (rest lista))))v

(else (filtro pred (rest lista)))))

Éste es el tercer ejemplo de un procedimiento doblemente recursivo porque hay dos líneas distintas en las que se utiliza el mismo procedimiento. El primer ejemplo fue el de las torres de Hanoi y el tercero el algoritmo de ordenamiento por combinación, mergesort. Es importante notar que en ambos usos del procedimiento se recorta el problema. La primera vez que se usa es porque se encuentra un elemento que pasó el filtro, en el segundo caso se emplea cuando el elemento actual no pasó. Algunos ejemplos son:

> (filtro odd? '(1 2 3 4 5))

(1 3 5)

> (filtro even? '(1 2 3 4 5))

(2 4)

Entrada y salida

En la introducción se mostró un procedimiento que resuelve el problema de las torres de Hanoi. En ese programa se aprecia que para desplegar cosas en la pantalla se utiliza display, que imprime la representación de cualquier cosa que se le dé como argumento.

También se presenta un procedimiento que imprime una nueva línea en la pantalla, se llama newline. Algunos ejemplos son:

> (display "Hola mundo")

Hola mundo

> (display '(1 2 3 4 5))

(1 2 3 4 5)

v> (newline)

El procedimiento para hacer lo contrario, es decir, leer cosas que entren por el teclado, se llama read, pero de éste se hablará más adelante.


Inicio de página