2.5.2.1. Repetición un Número de Veces


REPEAT

Evalúa cada expresión el número de veces que seespecifique en el argumento entero, y devuelve el valor de laúltima expresión
(repeat entero expresión ...)
El argumento entero debe ser un número enteropositivo.

Ejemplos de iteraciones con REPEAT:

FACTORIAL ITERATIVO

Como primer ejemplo analizaremos la función FACT2 propuesta porDennis Shinn <jeeper@halcyon.com>en el newsgroup comp.cad.autocad en septiembre de 1996. La explicación es nuestra traducción libre del original.
(defun fact2 (n / x y) (setq x 1 y 1) (repeat (1- n) (setq x (1+ x) y (* x y) ) ))
En la primera línea se asigna el valor inicial correcto a las dosvariable que llamamos x e y.
La repetición se establece para un número específico deveces según el número que se pase como argumento a lafunción. Puesto que la operación del cálculo del factorialimplica la cantidad de números a multiplicar menos 1, establecemos en (1- n) el número de repeticiones.
Ahora vienen los cálculos matemáticos: (setq x (1+ x) y (* xy))
Durante cada iteración de esta expresión, la x seincrementa por un valor de 1 cada vez, e y se incrementa comoel producto de ella misma y el próximo valor mayor de x, etc.,etc.
Obsérvese que no se ha implementado un control de errores, quees algo deseable en un lenguaje de programación. Tanto 0 como 1 quedan indefinidos, ya que ninguno de los dos permitirá queocurra la iteración. El REPEAT simplemente no repite. Vale, sinembargo para demostrar las posibilidades de un verdadero lenguaje deprogramación (como LISP) para realizar verdaderas operaciones derecursión e iteración.
Como muestra de una implementación para atrapar posibles errorespodríamos crear otra rutina fact3 que llame a la rutina fact2sólo en los casos apropiados:
(defun fact3 (n) (cond ((and (numberp n)(> n 1)) (fact2 n) ) ((= n 1) 1) (t nil) ))
En este caso se prueba primero si el argumento n es un número mayor que1, en cuyo caso se ejecuta la función fact2. En caso de ser igual a 1 sedevuelve 1, y en cualquier otro caso se devolverá NIL.

Predicado PALINDROMOP

El predicado PALINDROMOP debe devolver T (cierto) si unacadena de texto es un palíndromo, es decir, si se lee lo mismo deizquierda a derecha que al revés. Se ha utilizado la función STRLEN para determinar el número de repeticiones, lafunción SUBSTR para ir extrayendo caracteres para compararlos,uno a uno, comenzando de izquierda a derecha y de derecha a izquierda, y lafunción STRCASE de manera que se ignore la caja(mayúsculas o minúsculas). Se emplean dos variables locales, cont y resultado. Esta segunda se establece inicialmente comoT y bastará que no sea igual una de las parejas de letrasanalizadas para que adopte el valor de NIL (falso). Es obvio que bastará con un número de repeticiones igual a la mitad de la longitud de la cadena de texto, pues más allá de eso se estaría comparando las mismas parejas de caracteres. Al ser ambos argumentos de la división números enteros, el resultado también lo sería, truncando los decimales, por lo que en una cadena con número impar de caracteres no se compararía el carácter centras consigo mismo.
(defun palindromop (cadena / cont resultado) (setq cont 0 resultado t ) ;_ fin de setq (repeat (/ (strlen cadena) 2) (if (not (equal (strcase (substr cadena (1+ cont) 1)) (strcase (substr cadena (- (strlen cadena) cont) 1)) ) ;_ fin de equal ) ;_ fin de not (setq resultado nil) ) ;_ fin de if (setq cont (1+ cont)) ) ;_ fin de repeat resultado) ;_ fin de defun

Inicio |Índice | Continuar...
Subpáginas (1):Subject: Re: wanted! Lisp