Está en la página 1de 12

Programacin del

lenguaje C
TAKASHI SUGASAWA

Programacin del lenguaje C (9. Funciones recursivas)

Programacin del lenguaje C


9. Funciones recursivas
contenidos
El uso de una funcin recursiva

Programacin del lenguaje C (9. Funciones recursivas)

Funciones recursivas
Se dice que una funcin es recursiva, si se llama a s misma.
Funcin recursiva es uno de los temas que son difciles de entender en el campo
de programacin.
Un ejemplo de la funcin recursiva, que calcula la factorial de un valor:
factorial.c

#include <stdio.h>
unsigned int factorial(unsigned int n)
{
if (n == 0 || n == 1)
return 1;
else
return n * factorial(n - 1);
1)
}

Versi
Versin no recursiva
unsigned int factorial(unsigned int n)
{
int resultado = 1;
int i;
if (n >= 2) {
for (i = 2; i <= n; i++)
resultado *= i;
}
return resultado;

main()
{
}
unsigned int i;
for (i = 0; i <= 12; i++)
printf("%d! = %d\n", i, factorial(i));
}

n! = n x (n-1) x ... x 2 x 1
= n x (n-1)!

(n-1)!

Programacin del lenguaje C (9. Funciones recursivas)

Cmo se ejecuta ?
En el caso de i=4 ...
main()

factorial(4)

1
8
4*6=24

factorioal(4)

return 4 * factorial(3);

2
factorioal(3)

3*2=6

return 3 * factorial(2);

3
factorioal(2)

2*1=2

return 2 * factorial(1);

4
factorioal(1)

return 1;

Programacin del lenguaje C (9. Funciones recursivas)

Acerca de funciones recursivas...


El algoritmo recursivo es particularmente apropiados cuando el problema a
resolver o los datos a tratar se definen en forma recursiva. Es ms compacto y a
menudo ms sencillo de escribir y comprender.
Sin embargo, el uso de la recursin debe evitarse cunado haya una solucin
obvia por iteracin. En este sentido el ejemplo de factorial no es bueno.
Por cada ejecucin de recursiva de la funcin, se necesita cierta cantidad de
memoria para almacenar las variables locales y el estado en curso del proceso
de clculo.
El llamar a una funcin recursivamente consume el espacio de memoria,
que se llama pila (STACK).
Como pila una cierta cantidad de memoria se asigna estticamente al
proceso del programa, cuando un programa se arranca.
El enlazador decide la cantidad de pila. En VC++, por defecto 1MB.
En aplicaciones prcticas es imperativo demostrar que el nivel mximo de
recursin es, no slo finito, sino realmente pequeo.
Generalmente es peligroso guardar valores en las variables globales en una
funcin recursiva. Por que cada vez de la llamada a la funcin recursiva, la
misma rea se sobrescribirn.
Debemos usar las variables locales, los parmetros y el valor devuelto.

Programacin del lenguaje C (9. Funciones recursivas)

Ejercicio9a
En matemticas, un nmero de Fibonacci forma una sucesin
definida recursivamente por:

F (1) = 1
F (2 ) = 1
F (n ) = F (n 1) + F (n 2 )

Haga un programa para calcular los nmeros de Fibonacci, usando


una funcin recursiva.
Tambin cree mismo programa sin usar la funcin recursiva.

Programacin del lenguaje C (9. Funciones recursivas)

Resultado
F(1): 1
F(2): 1
F(3): 2
F(4): 3
F(5): 5
F(6): 8
F(7): 13
F(8): 21
F(9): 34
F(10): 55
F(11): 89
F(12): 144
F(13): 233
F(14): 377
F(15): 610
F(16): 987
F(17): 1597
F(18): 2584
F(19): 4181
F(20): 6765
6

Ejercicio10a
Solucione el problema Torre de Hanoi usando algoritmo recursivo.

A
1

Tres barras A, B, C estn fijadas en una mesa.


Varios discos estn acumulados, penetrando por la barra A.
Cada disco ms pequeo est sobre el disco ms grande.
Desplace todos los discos de la barra A a la barra B, obedeciendo las 3 reglas
siguientes:
1. Puede mover un solo disco cada vez.
2. No hay que colocar un disco sobre el disco ms pequeo.
3. Puede ubicar los discos solamente en el lugar de barra A, B, C.
Cmo se realiza en el case de 5 discos ?
Cuntas veces hay que pasar el disco mnimo ?

Programacin del lenguaje C (9. Funciones recursivas)

En el caso de 3 discos...

B
2

El programa debe dar una


solucin como lo siguiente.

Disco1: AJB

2
1

Disco2: AJC

Disco1: BJC
Disco3: AJB
Disco1: CJA
Disco2: CJB
Disco1: AJB
Necesita 7 pasos al mnimo.

Programacin del lenguaje C (9. Funciones recursivas)

Si la solucin del caso de n-1 discos est ya conocido, el case de n discos se puede
resolve como sigue.

B
2

n-1
n

n-1

n
1

n
1

n-1

n-1
n
Programacin del lenguaje C (9. Funciones recursivas)

Un ejemplo de la funcin prototipo


El nmero de discos.

Cada es uno de 'A', 'B', 'C'.


Partida

Destino

Otro

void torre_de_hanoi(int n, char src, char dst, char tmp)


{
}
Entonces, la primera llamada ser como sigue...
torre_de_hanoi(10, 'A', 'B', 'C');

Programacin del lenguaje C (9. Funciones recursivas)

10

Resultado
disco1:
disco2:
disco1:
disco3:
disco1:
disco2:
disco1:
disco4:
disco1:
disco2:
disco1:
disco3:
disco1:
disco2:
disco1:
disco5:
disco1:
disco2:
disco1:
disco3:
disco1:
disco2:
disco1:
disco4:
disco1:
disco2:
disco1:
disco3:
disco1:
disco2:
disco1:

A
A
B
A
C
C
A
A
B
B
C
B
A
A
B
A
C
C
A
C
B
B
C
C
A
A
B
A
C
C
A

=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>

B
C
C
B
A
B
B
C
C
A
A
C
B
C
C
B
A
B
B
A
C
A
A
B
B
C
C
B
A
B
B

Pero, cuntos pasos ?

Programacin del lenguaje C (9. Funciones recursivas)

12

Muchas gracias por su atencin !


Hasta luego !

Programacin del lenguaje C (9. Funciones recursivas)

15