Documente Academic
Documente Profesional
Documente Cultură
6. RECURSIVIDAD
- Pruebe la rutina con todos los datos que se proporcionan, de una manera
formal, utilizando la representacin de memoria.
a) n! ; dato de prueba: n = 4.
F0 = 0
F1 = 1
Fn = Fn 1 + Fn 2 para n 2
Escriba una rutina recursiva Fibonacci (n) para calcular el n-simo trmino de la
sucesin. Pruebe su solucin para n = 4.
Recursividad 6-1
Algortmica y Programacin
n!
C kn = ( 0 k n)
k! ( n k )!
C 0n = 1 n 0
Ckn = 0 si k > n
C kn = C kn11 + C kn 1 en otro caso
Utilice esta definicin recursiva para escribir una rutina Binomial (n,k). Pruebe su
solucin para: k = 3 y n = 3.
A(0,n)=n+1
A(m,0)=A(m-1,1)
A(m,n)=A(m-1,A(m,n-1) ) si m, n > 0
Ackermman usa una pila de registros de activacin muy grande, an para valores
pequeos de los parmetros, y esto provoca que no sea posible calcular la rutina
utilizando la computadora.
Recursividad 6-2
Algortmica y Programacin
m n Ackermman profundidad
1 0 2 2
2 0 3 5
3 0 5 15
4 0 13 107
2 1 5 14
2 2 7 27
2 3 9 44
2 4 11 65
2 7 17 152
3 4 125 10,307
3 5 253 42,438
3 6 509 172,233
3 10 8189 44,698,325
3 11 16381 > 64,000,000
25 14 33 49 18 22
22 18 49 33 14 25
6. Escriba una rutina recursiva que calcule la suma de los elementos de un vector
numrico:
Recursividad 6-3
Algortmica y Programacin
mcd( m , 0 ) = m
mcd( m , n ) = mcd( n , m mod n )
Escriba una rutina recursiva que calcule el mximo comn divisor de dos nmeros.
8. Haga un programa que lea un entero y lo imprima en sentido inverso, utilizando una
rutina recursiva. Por ejemplo, si lee 254, entonces debe imprimir 452. Parmetros: 1,
variables locales: 0
9. Haga una rutina recursiva que busque un elemento en un vector de enteros, los cuales
se encuentran desordenados. La rutina deber ser entera y regresar, si el elemento
buscado se encontr, el ndice donde lo encontr y un -1 en otro caso. Parmetros: 3,
variables locales: 0
10. Haga una rutina recursiva que encuentre el ndice donde se localiza el mximo de un
vector de enteros. Parmetros: 3, variables locales: 0
11. Dado un vector de enteros, haga una rutina recursiva que los ordene. Utilice el mtodo
de seleccin directa. Parmetros: 2, variables locales: 2
12. Haga una rutina recursiva que busque un elemento en un vector de enteros,
ordenados en forma ascendente. La rutina debe utilizar el mtodo de bsqueda binaria.
La rutina deber ser entera y regresar, si el elemento buscado se encontr, el ndice
donde lo encontr y un -1 en otro caso. Parmetros: 4, variables locales: 1 (se puede
evitar).
13. Las particiones de un entero n son todas las formas en las cuales n puede
descomponerse como suma de varios sumandos.
6=5+1=3+3=4+2=4+1+1=3+1+1+1=
El nmero de particiones de un entero n puede calcularse con el siguiente esquema
recursivo:
Sea P(n, n) el nmero de particiones del entero n.
Recursividad 6-4
Algortmica y Programacin
14. Escriba una rutina recursiva que calcule la raz cuadrada de un nmero no negativo.
La entrada consiste de tres nmeros N, A y E, donde N es el nmero al que se le
calcular la raz, A es una aproximacin de la raz cuadrada, y E es el error aceptado
en el resultado. La funcin que se debe utilizar es la siguiente:
A si | A2 - N | < E
RAIZ( N, A, E ) = A2 + N
RAIZ( N, ,E) en otro caso
2A
Use las siguientes tercias como datos:
2 1.0 .001
3 1.5 .001
8 2.5 .001
225 14.2 .001
15. Programe una rutina recursiva para evaluar un polinomio utilizando el Mtodo de
Horner.
16. Dada una frase, se desea encontrar en otra cadena su inverso utilizando una rutina
recursiva.
Escriba un programa que lea una frase, cree en otra cadena de caracteres el inverso
de dicha frase, por medio de:
a) Un procedimiento (void). Parmetros: 3, variables locales: 0.
b) Una funcin String. Parmetros: 2, variables locales: 0
Por ltimo su programa debe imprimir la frase resultante.
17. La siguiente es una estrategia para encontrar, con una rutina recursiva el k-simo
elemento ms pequeo de un conjunto S de enteros. Si el nmero de elementos en S
| S | +1
( |S| ) es impar y si k se inicializa en , esta rutina encontrar la mediana del
2
conjunto S. Sea |S| igual a N:
Rutina ENCUENTRA ( k , S , N )
Sea m el primer elemento de S
Divida S en tres conjuntos:
S1 compuesto de los elementos < m
S2 compuesto de los elementos = m
S3 compuesto de los elementos > m
Si k |S1|
entonces regresa ENCUENTRA ( k , S1 , |S 1 | )
si no, si k |S1 | + |S 2|
entonces regresa m
si no, regresa ENCUENTRA ( k - |S1| - |S2 | , S3 , |S 3 | )
Recursividad 6-5
Algortmica y Programacin
18. Dada una frase y un cierto carcter se desea buscar dicho carcter en la frase,
indicando cuntas veces aparece, con una rutina recursiva.
a) Escriba un programa que lea una frase, el carcter que se desea buscar en la
frase y que, por medio de una rutina recursiva, encuentre e imprima el nmero de
veces que dicho carcter se repite en la frase.
frase la palabra
carcter a
19. Dado un entero n el cual se encuentra escrito en una base b menor a 10, su
equivalente en base 10 se calcula sumando los dgitos del entero n multiplicados por
las potencias sucesivas de b, comenzando por las unidades.
Por ejemplo:
( 234 ) 5 = 2 * 5 2 + 3 * 5 1 + 4 * 5 0 = ( 69 ) 10
Escriba una rutina recursiva que transforme un entero n escrito en una base b (con b
< 10) a su equivalente en base 10.
20. Escriba una rutina recursiva que convierta enteros en base 10 a su representacin en
base r haciendo divisiones sucesivas. El nombre de la rutina debe ser CONVIERTE
con los parmetros NUMERO y BASE. NUMERO denota el entero a ser convertido y
BASE la base a la que el entero debe ser convertido. La representacin en base
BASE es regresada en forma de cadena de caracteres.
Por ejemplo, para calcular la representacin en base 6 de 184 se debe dividir entre 6
repetidamente y los residuos resultantes deben ser concatenados.
184 / 6
30 / 6
5/6
5 0 4
504 = 5 * 62 + 0 * 61 + 4 * 6 0 = 18410
Recursividad 6-6
Algortmica y Programacin
a) Lea la informacin del archivo y guarde las claves de las materias en el vector de
enteros A y los nombres de las materias en el vector de cadena de caracteres B.
23. Haga una rutina recursiva que reciba un entero positivo n y regrese la cantidad de
cifras que componen el entero. Por ejemplo, si n es 1423, entonces la rutina deber
regresar 4. Parmetros: 1, variables locales: 0.
24. Haga una rutina recursiva que reciba un entero positivo n y regrese el entero en
sentido inverso. Por ejemplo, si n es 275, entonces la rutina debe regresar 572.
Parmetros: 2, variables locales: 0.
25. Escriba un procedimiento recursivo TRIM que quite todos los espacios en blanco del
principio y del final de una cadena de caracteres. Por ejemplo, TRIM( CMPT 181 )
regresa CMPT 181.
Recursividad 6-7