Ejercicios de recursividad

Anuncio
MANUAL DE RECURSIVIDAD
Cuando se analiza un problema y se descubre que se puede resolver por partes,
en las cuales se vuelve a plantear el problema original pero de forma más
reducida, entonces se puede decir que el problema se puede resolver por
recursión.
Características:
 Implementación intuitiva. La traducción de la solución recursiva de un
problema a código Lisp es prácticamente inmediata.
 Útil para optimizar cálculos.
 Útil cuando hay varios niveles de anidamiento. La solución para un nivel
es válida para el resto.
Ejemplos de recursividad:
1. Cálculo de la potencia de un número
(defun potencia (x n)
(cond ((= n 0) 1) ((evenp n)
(expt (potencia x (/ n 2)) 2)
)
(t (* x (potencia x (- n 1)))))
)
potencia(2 3)  8
2. Contar los átomos de cualquier expresión LISP
(defun cuenta-atomos (expr)
(cond ((null expr) 0)
((atom expr) 1)
(t ( +
(cuenta-atomos (first expr))
(cuenta-atomos (rest expr))))
)
)
3. Función de Fibbonacci
Fib(n) = Fib(n-1) + Fib(n-2) si n>1,
Fib(n)=1 si n <= 1
Ejemplo: Fibonacci 5 = 1 2 3 5 8  Se mostrara el último elemento.
(defun fibo (x)
( if ( <= x 1) 1
(+ (fibo (- x 1)) (fibo (- x 2)))
)
)
(fibo 5)  8
4. Producto Escalar
(defun producto (vector1 vector2)
(if (or (null vector1) (null vector2)) 0
(+ (* (first vector1) (first vector2))
(producto (rest vector1) (rest vector2)))
)
)
(producto ‘(2 3) ‘(4 5))  23
5. Algoritmo de Euclides
m.c.d. (a , b) = m.c.d. (b , a mod b) si b>0
m.c.d. (a , b) = a
si b=0
Ejemplo: m.c.d. (57, 23) = m.c.d. (23, 1) = m.c.d. (1,0) = 1
(defun mcd(a b)
(if (> b 0)
(mcd b (mod a b)) a)
)
)
(mcd 57 23)  1
6. Cálculo de un factorial
(defun factorial (n)
(if (zerop n) 1
(* n (factorial (1- n)))
)
)
(factorial 4)  24
7. Función para saber si un número es primo
(defun es_primo (numero)
(es_primo_recursivo numero 2)
)
(defun es_primo_recursivo (numero divisor)
(if (>= divisor numero) t
(if (= 0 (mod numero divisor)) nil
(es_primo_recursivo numero (+ 1 divisor))
)
)
)
(es_primo 5)  T
Ejemplos de recursividad con listas:
1. Verificar si un elemento pertenece a una lista.
(defun pertenece (x lista)
(if (endp lista)
nil
(if (= x (car lista))
lista
(pertenece x (cdr lista))
)
)
)
(pertenece 5 ‘(1 2 5))  (5)
2. Función que cuenta cuantos números pares hay en una lista
(defun cuenta-pares (lista)
(cond ((null lista) 0)
((numberp lista)
(if (evenp lista) 1 0))
((cdr lista) (+ (cuenta-pares (car lista))
(cuenta-pares (cdr lista))))
(t (cuenta-pares (car lista))
)
)
)
(cuenta-pares ‘(1 2 3 4))  2
3. Función que suma los elementos impares de una lista
(defun suma_impares( lista )
(cond ((null lista) 0)
((oddp (car lista)) (+ (car lista) (suma_impares
(cdr lista))))
(t (suma_impares (cdr lista)))
)
)
(suma_impares '(1 2 3 4 5 6))  9
4. Contar el número de sublistas que hay en una lista
(defun sublistas (expresion)
(cond ((or (null expresion) (atom expresion)) 0)
(t (+ (if (atom (first expresion)) 0 1)
(sublistas (first expresion))
(sublistas (rest expresion))))
)
)
(sublistas ‘(a (b c) ((d e) f)))  3
Descargar