Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Algoritmo Recursivos
Algoritmo Recursivos
Algoritmos recursivos
Introducción
función factorial(n)
si n = 1
devolver 1
sino
devolver n * factorial(n – 1)
fin si
fin función
http://es.wikipedia.org/wiki/Programaci%C3%B3n_funcional
función A
…
A(…)
…
fin función
función A función B
… …
B(…) A(…)
… …
fin función fin función
función A
…
A(…)
…
fin función
función A
…
La recursividad será no
si condición
lineal si se cumple
A(…)
condición, pues en tal
fin si
caso se producen dos
…
llamadas recursivas.
A(…)
…
fin función
función A
… No existe ningún
devolver A(…) procesamiento posterior
fin función a la llamada a A().
función A
… La llamada a la función
devolver A(…) + 5 recursiva no es la última
fin función operación efectuada (en
ambos casos es una
suma)
función A
…
devolver A(…) + A(…)
fin función
Es necesario, pues:
▪ Formular el caso general que debe poder resolverse en función del caso
base y una transformación del caso general hacia uno más sencillo.
La pila de llamadas
Todo programa en ejecución tiene una pila asociada para éste propósito. En
los lenguajes de alto nivel (como C o Java) la gestión de la pila de llamadas la
realiza de forma automática el compilador, y el programador no necesita
preocuparse de su funcionamiento.
dirección de memoria
Pila
función main()
… …
23 funciónA(5)
24 …
fin función 68
Llamada a 9
funciónB
8
60 función A()
Espacio variables
… …
67 funciónB(8,9) Llamada a 24 dir. retorno
68 … funciónA
5 parámetro 5
fin función
…
dirección de
80 función B() crecimiento de
… … la pila
fin función
Llamada 6 resultado
principal
3 parámetro n
…
En cada llamada recursiva, se requiere espacio en la pila para almacenar
dirección de retorno, parámetros y resultado de la llamada. La pila crece hacia
arriba conforme se efectúan las llamadas: llamada principal, 1ª llamada recursiva,
2ª llamada recursiva y 3ª llamada recursiva (la final, que llega al caso base).
1
Escribe un algoritmo recursivo que calcule el elemento de
cardinal más elevado de un vector de datos de tipo
entero.
Por ejemplo, para la entrada {1, 3, 25, 9, 20} obtendremos
como resultado 25.
Introducción
Listas enlazadas
En una estructura del tipo lista enlazada cada nodo contiene una referencia
al siguiente nodo (alternativamente es posible que contenga una referencia al nodo
anterior, en las listas doblemente encadenadas), y un conjunto de atributos extra
específicos del nodo en cuestión:
estructura Nodo
dato: entero
siguiente: Nodo
fin estructura
Una función que opere de forma recursiva sobre una lista enlazada, deberá
procesar el nodo actual y pasar como parámetro el nodo siguiente. La condición de
salida en este caso se dará cuando lleguemos a un nodo de valor null, que indicará
el final de la lista:
función procesaLista(nodo)
si nodo <> null
imprime(nodo.dato)
procesaLista(nodo.siguiente)
fin si
fin función
Árboles
En una estructura del tipo árbol cada nodo contiene una referencia a los
hijos izquierdo y derecho de la rama actual:
El algoritmo se llama pasando como parámetro inicial el nodo raíz del árbol,
y las llamadas siguientes procesan los nodos hijos o subárboles del nodo principal,
hasta llegar al caso base, que en un árbol corresponde a un nodo que no tiene
nodos hijos, es decir, un nodo cuyos atributos hijoIzq e hijoDch son null. Estos
nodos reciben el nombre de hojas del árbol. En el caso de un árbol, se procesan
recursivamente tanto su lado izquierdo como su lado derecho:
función procesaArbol(nodo)
si nodo <> null
imprime(nodo.dato)
procesaArbol(nodo.hijoIzq)
procesaArbol(nodo.hijoIzq)
fin si
fin función
Para que una función recursiva sea final de pleno derecho, la llamada
recursiva a la función debe ser la última operación realizada:
Ejemplos___________________________________________________________
función recursivaA()
num := 10
recursivaA();
a = a + 4;
devolver num
fin función
función recursivaB()
int q = 4;
q = q + 5;
devolver q + test1()
fin función
función recursiva3 ()
int b = 5;
b = b + 2;
devolver recursiva3()
Diseño de estructuras de datos y algoritmos 15
fin función
__________________________________________________________________
Recursividad vs Iteración
▪ Conveniencia
▪ Eficiencia
- Velocidad de ejecución:
- Uso de memoria:
▪ Sencillez
▪ Intuitividad
1
Reescribe el algoritmo para calcular el factorial de un
número de forma iterativa.