Anda di halaman 1dari 4

Programacin avanzada 2004

II. Recursin.
1. Definiremos la funcin de Ackermann como una funcin de los enteros no negativos N y M sobre los enteros mediante las siguientes reglas: M =0 si N +1 N =0 si A( M , N ) = A( M 1,1) A( M 1, A( M , N 1)) si M 0, N 0

a) Defina un algoritmo y una funcin recursiva en C que permitan calcular A(M, N) para M 0 y N 0. b) Realice la prueba de escritorio para calcular A(3,2). c) Defina un algoritmo y una funcin en C no recursivos que permitan calcular A(M, N) para M 0 y N 0. 2. El problema del Mximo Comn Divisor (MCD), fue resuelto por Euclides y para hallar el MCD de dos nmeros enteros calcular M y N para M 0 y N 0 , se puede usar el siguiente mtodo: M si N = 0 MCD( M , N ) = MCD( N , M % N ) si N > 0
a) Defina un algoritmo y una funcin recursiva en C que permitan calcular MCD(M, N) para M 0 y N 0. b) Realice la prueba de escritorio para calcular MCD(140,28). c) Defina un algoritmo y una funcin en C no recursivos que permitan calcular MCD(M, N) para M 0 y N 0. 3. Un cuento vietnamita dice que si alguien logra mover los 24 discos de la primera torre (A) a la tercera torre (C) sin sacar mas de un disco a la vez y sin encimar un disco mayor sobre uno menor, siempre uno se puede auxiliar con la torre C, entonces llegar el fin del mundo. Con el uso de las computadoras no es difcil encontrar la solucin. 2. Defina un algoritmo y una funcin recursiva en C que permitan mover N de la torre A a la C respetando las reglas antes enunciadas. 3. Realice una prueba de escritorio para N = 3 y para N = 4.

A
1 2

...
N-2 N-1 N

4. Haciendo la Paz. El problema consiste en colocar en un tablero de ajedrez normal 8 reinas sin que alguna ataque a las dems. En el ajedrez, una reina puede atacar a otra pieza
1

Programacin avanzada 2004 desplazndose cualquier distancia en casillas: sobre la fila que ocupa, la columna que ocupa o bien sobre la diagonal o las diagonales que ocupa. Un tablero de ajedrez normal tiene 8 filas y 8 columnas. Hacer la Paz, significa colocar las ocho reinas, sin que compartan la misma fila, columna o diagonal. a) Busque al menos dos soluciones a mano en un tablero de ajedrez o con un papel cuadriculado. b) Proponga un algoritmo recursivo que resuelva el problema y encuentre al menos una solucin. c) Desarrolla un programa que use una funcin recursiva en C que encuentre todas las soluciones posibles. Sugerencia para el ejercicio 4. Consulte la pgina 70 del libro: - Algoritmos y Estructuras de Datos en C - Aproximacin en C - Autor: Charles F. Bowman - Editorial: Oxford University Press Mxico SA de CV - 1999 - ISBN 970-613-459- X 5. Es posible evaluar la funcin exponencial de argumento real mediante la siguiente relacin:

e x = s n , donde s n = x n / n!
Lgicamente la suma no se podr en la prctica numrica extender hasta , por tanto habr que recortarla hasta cierto lmite, use como criterio de parada el hecho de que s n . a) Escribe un programa recursivo que evale mediante la expresin anterior la exponencial de x. b) Realiza una prueba de escritorio con x = 1 y =1x10-6. c) Escribe una funcin iterativa que realice el clculo. d) Para (a) y (c) compra con la funcin de biblioteca ubicada en <math.h> : exp(x). Construye una tabla de los resultados de (a), (c) y exp(x) con x= 0.. 10, con incrementos de 0.1 y = 1x10-7 Evalue los errores medios entre tus resultados y la funcin de biblioteca. Donde N e = 1 k =1 ak bk . N
k =0

6. Escriba una funcin que implemente la clsica serie de Fibonacci dada por la relacin: 1 n = 0,1 F ( n) = F (n 1) + F (n 2) n > 1 a) De manera recursiva b) De manera itrativa c) Para el llamado F(7) calcule cuntas veces se repite la evaluacin de cada trmino.

Programacin avanzada 2004 7. Escriba un algoritmo y su correspondiente funcin para la multiplicacin de enteros positivos a*b basada en el algoritmo de suma:

a if (b == 1) a *b = a * (b 1) + a if (b > 1)
a) implemente la versin recursiva b) implemente la versin iterativa 8. Escriba la funcin correspondiente a la bsqueda binaria de una serie de N nmeros reales ordenados de menor a mayor en un arreglo A[]. a) Implemente la versin recursiva b) Implemente la versin iterativa c) Determine el mximo nmero de intentos que hace ste algoritmo para encontrar un nmero en el arreglo o bien determinar que no se encuentra. 9. Escriba una definicin recursiva de a+b, donde a y b son enteros no negativos, en trminos de la funcin sucesor: succ, definida por: succ(int x) { return (x++);} 10. Considere que A[] es un arreglo de enteros, construya un algoritmo recursivo y su correspondiente funcin para cada uno de los siguientes problemas: a) El elemento mximo de A. b) El elemento mnimo de A. c) La suma de los elementos de A. d) El producto de los elementos de A. e) El promedio de los elementos de A. 11. Para hallar el MCD (mximo comn divisor) de dos enteros x e y se puede considerar que: * mcd(x,y) = y * mcd(x,y) = mcd(y,x) * mcd(x,y) = mcd(y,x%y) si (yx) && (x%y==0) si (x<y) en caso que una de las anteriores no suceda.

a) Implemente la versin recursiva de la funcin mcd(x,y) b) Implemente la versin iterativa de la funcin mcd(x,y) Nota: p%q denota la operacin mdulo (residuo entero de la divisin entera) 12. Definamos la funcin comb(n, k) como aquella funcin que calcula el nmero de equipos de k personas que pueden formarse, dados n jugadores entre los cuales se puede elegir. Por ejemplo, comb(4,2) = 6 , ya que dados los jugadores A, B, C, D; se pueden formar los equipos: AB, AC, AD, BC, BD y CD. Verifique que la relacin comb(n ,k) = comb(n-1, k) + comb(n-1, k-1),

Programacin avanzada 2004

calcula de manera correcta el nmero de posibles combinaciones. a) Escriba una funcin recursiva para evaluar comb(n, k) con {n, k} > 0. b) Escriba un programa para probar su funcin c) Verifique los resultados para valores pequeos de n y k. 13. Escriba una funcin que le permita escribir las permutaciones de N letras no repetidas. Por ejemplo las permutaciones de {A, B, C} son 6: ABC ACB BAC BCA CAB CBA

Y las permutaciones de {A, B, C, D} resultan 24: ABCD ABDC ACBD ACDB ADBC ADCB BACD BADC BCAD BCDA BDAC BDCA CABD CADB CBAD CBDA CDAB CDBA DABC DACB DBAC DBCA DCAB DCBA

Una buena opcin es usar una funcin recursiva. 14. Considera las siguientes funciones: a) H(n+1, x) 2x H(n, x) + H(n-1, x) = 0, donde H(0, x) = 1, H(1, x) = x. b) G(n, x) x G(n-1, x) + x2 G(n-2, x) = 1, donde G(0, x) = , H(1, x) = x/2. En ambos casos n0 , x . Construye la versin recursiva de cada funcin y la versin iterativa. Escribe un programa para cada funcin y versin que produzca una tabla tabular de valores en el intervalo x [-5, 5] con 25 elementos. Verifica que los resultados sean los mismos para cada funcin en las dos versiones.

Anda mungkin juga menyukai