Sunteți pe pagina 1din 7

Algortmica y Programacin

6. RECURSIVIDAD

1. Para cada uno de los siguientes incisos:

- Escriba la definicin recursiva.

- Escriba una rutina para implementar dicha definicin.

- 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.

b) Calcule el producto de dos enteros positivos m y n utilizando slo el


operador de suma; datos de prueba: m = 8, n = 3.

c) Calcule a n (n entero mayor o igual a cero) utilizando slo el operador de


multiplicacin; datos de prueba: a = 2, n = 3.

2. Una famosa sucesin de nmeros es la serie de los nmeros de Fibonacci, que se


define como:

F0 = 0
F1 = 1
Fn = Fn 1 + Fn 2 para n 2

Mediante la aplicacin de esta regla, podemos listar los primeros nmeros de


Fibonacci:

1, 1, 2, 3, 5, 8, 13, 21, 34, 55, ...

Observe que cada uno es la suma de los dos anteriores.

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

3. La definicin habitual de los coeficientes binomiales se expresa en trminos de


factoriales:

n!
C kn = ( 0 k n)
k! ( n k )!

Sin embargo, tambin es posible dar una definicin recursiva:

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.

4. La funcin de Ackermman para dos enteros m y n mayores o iguales a cero se define


de la siguiente manera:

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

Escriba una rutina recursiva para implementar Ackermman.

Pruebe su solucin para: m = 1 y n = 2.

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.

Por ejemplo, para m = 5 y n = 0, se crean ms de 64 millones de registros de


activacin (256 millones de bytes). Si utilizamos Borland C++ 4.52, la pila tiene una
capacidad aproximada de 172, 388 bytes y utilizando Visual C++ 6.0 contamos con
una pila de 256, 400 millones de bytes, aproximadamente.

Recursividad 6-2
Algortmica y Programacin

En la siguiente tabla se muestran los resultados de calcular Ackermman y el nivel de


profundidad de la recursin para algunos valores de m y n.

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

Ackermman(3,11) no fue posible calcularlo con la computadora ya que la pila que se


crea es muy grande, sin embargo no fue difcil calcular su valor. Obsrvese que
Ackermann(m, n) = (m 1) * Ackermman(m, n-1) + m. Por lo tanto, Ackermman(3, 11)
= 2 * 8189 + 3 = 16381.

5. Escriba una rutina recursiva que:

a) Imprima el contenido de un arreglo en orden inverso. Parmetros: 2, variables


locales: 0

Por ejemplo, para el arreglo:

25 14 33 49 18 22

la rutina debe imprimir:

22 18 49 33 14 25

b) Imprima el contenido de un arreglo en el orden dado. Parmetros: 2, variables


locales: 0

6. Escriba una rutina recursiva que calcule la suma de los elementos de un vector
numrico:

a) Sumando del ltimo al primero. Parmetros: 3, variables locales: 0

b) Sumando del primero al ltimo. Parmetros: 2, variables locales: 0

Recursividad 6-3
Algortmica y Programacin

7. El algoritmo de Euclides para encontrar el mximo comn divisor (mcd) de dos


nmeros enteros positivos (m y n) se puede definir recursivamente con los siguientes
pasos:

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.

Pruebe su solucin con m = 210 y n = 77.

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.

Por ejemplo, el entero 6 se puede descomponer de 11 formas:

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.

P(1, n) = 1 para todo n.


P(m, 1) = 1 para todo m.
P(m, n) = P(m, m) si m < n.
P(m, m) = 1 + P(m, m -1) si m = n
P(m, n) = P(m, n-1) + P(m-n, n) si m > n.

Dato de prueba: n = 5, es decir, pruebe con P(5, 5);

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 | )

Escriba la rutina ENCUENTRA, y siga la ejecucin con los valores k = 4, S = { 4, 7, 3,


6, 6, 2, 5}.

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.

b) Haga la representacin de la memoria suponiendo que los datos son:

frase la palabra
carcter a

Nota: Tanto la frase como el carcter pueden estar en maysculas o en minsculas.

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

Por lo tanto, la rutina regresa el valor 504.

Haga la representacin de la memoria de la llamada recursiva para NUMERO = 153 y


BASE = 6.

Recursividad 6-6
Algortmica y Programacin

21. Se tiene el archivo ENT.DAT, el cual contiene palabras.


Haga un programa que utilizando rutinas recursivas:
a) Lea las palabras del archivo y las guarde en el vector A y en B el total de veces
que la misma se repite en el texto (obviamente tambin se deben contar los
elementos que aparecen una sola vez). Mximo habr 1000 palabras.
Note que los vectores A y B son paralelos.

b) Imprima en la pantalla la palabra o palabras que ms veces se repite o repiten y el


nmero de veces, tanto como para encontrar el mximo como para la impresin de
las palabras se debe utilizar una rutina recursiva.
c) Ordene la informacin de los vectores A y B en forma ascendente con respecto al
total de veces que se repite una palabra.
d) Cree el archivo ORD.DAT con la informacin de los vectores A y B, ya ordenados.

22. Se tiene el archivo MATERIAS.DAT, el cual contiene claves de materias y sus


nombres. Puede haber 1000 renglones, o sea, 1000 materias. Las claves son de 5
dgitos. En el archivo la informacin est ordenada en forma ascendente por el
nombre de las materias.

Haga un programa que utilizando rutinas:

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.

b) Lea de pantalla el nombre de una materia y haciendo bsqueda binaria,


implementada recursivamente, la busque en B. Si la encuentra el programa deber
imprimir en pantalla su clave correspondiente. Si la materia dada por pantalla no
existe deber escribir en la pantalla un mensaje apropiado. Este proceso se
repetir hasta que el usuario en lugar de dar el nombre de una materia escriba
FIN. Las materias en el archivo estn en maysculas aunque el usuario no
necesariamente las da en maysculas.

c) Elimine la informacin de la materia cuyo nombre dio el usuario.

d) Cree el archivo NUEVAS.DAT con la informacin de las materias que no fueron


eliminadas.

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

S-ar putea să vă placă și