You are on page 1of 4

ELEMENTOS DE PROGRAMACIN - 1ER CUATRIMESTRE DE 2001 - U.N.S.

PROFESOR: CARLOS IVN CHESEVAR ASISTENTE: ANDREA SILVETTI

TRABAJO PRCTICO N 1(PRIMERA PARTE) PLANTEOS RECURSIVOS


Este prctico est especialmente pensado para que el alumno adquiera la habilidad de resolver problemas recursivos, esto es, problemas cuya solucin se plantea en funcin de la solucin de una instancia menor del mismo. Cada vez que tenga que escribir un planteo para un problema recursivo deber comenzar por identificar: cundo el problema es tan trivial que se resuelve por s solo?, es decir, que no necesita la solucin de una instancia menor para poder resolverse. cul sera una instancia menor del mismo problema?, de forma tal que si usted cuenta con la solucin para sta, pueda especificar la solucin para el problema completo con slo resolver una pequea tarea adicional. EJERCICIO 1. Dado un nmero entero N, escriba planteos recursivos para resolver cada uno de los
siguientes problemas: 1. Contar la cantidad de dgitos que tiene N. Ej.: para N=314, el resultado es 3. 2. Dado un dgito T, contar la cantidad de veces que aparece T en N. Ej.: Para N=13234, T=3; el resultado es 2. 3. Generar un nmero M a partir de los dgitos de N en orden inverso. Ej: para N=123, M=321 4. Contar la cantidad de dgitos pares que tiene N. Ej.: para N=22005, el resultado es 4. Para N=35, el resultado es 0

EJERCICIO 2. Definiremos como nmero de dgitos incrementales a todo nmero natural N tal que
N=dmdm-1...d1d0 tal que di+1 di para 0 i < m. Por ejemplo: 1227, 359, 88, 139 son nmeros de dgitos incrementales. Escriba un planteo recursivo para determinar si un nmero natural N es de dgitos incrementales

EJERCICIO 3. Escriba un planteo recursivo para el algoritmo de Euclides, esto es, un planteo para
determinar cul es el mximo comn divisor entre dos enteros positivos X e Y.

EJERCICIO 4. El cuadrado de un nmero N puede calcularse con la suma de los N primeros nmeros
impares. Escriba un planteo recursivo para obtener el cuadrado de un entero positivo N basndose en esta propiedad. n n-simo impar n2 3 2 * 3 1= 5 1+3+5=9 4 2 * 4 1= 7 1+3+5+7=16 Nota: Tenga en cuenta que el n-simo nmero impar se puede obtener como 2 * n - 1.

EJERCICIO 5. Definimos nmero promedio de un nmero entero positivo, al nmero que se obtiene de
sumar sus dgitos impares y restar sus dgitos pares. Escriba un planteo recursivo para obtener el nmero promedio de un entero positivo dado. Ej.: el nmero promedio de 318547 es 4 pues 7-4+5-8+1+3= 4. Qu modificaciones debera hacer a su planteo si no hubiera restriccin sobre el signo del nmero entero.

EJERCICIO 6. La representacin binaria de un nmero natural N, se obtiene con los restos que resultan de
dividir sucesivamente N por 2, hasta que el dividendo se hace 0. Dichos restos se utilizan en el orden inverso al que fueron calculados para armar el correspondiente nmero binario.

Por ejemplo: 28 en binario se calcula como

28 dividido 2 da 14, resto 0 14 dividido 2 da 7, resto 0 7 dividido 2 da 3, resto 1 ==> 28 en binario es 11100 3 dividido 2 da 1, resto 1 1 dividido 2 da 0, resto 1

Dado un nmero natural N, escriba un planteo recursivo para expresarlo en sistema binario.

EJERCICIO 7. Dados dos nmeros enteros N1 y N2, escriba planteos recursivos para:
1. Ver si N1 es prefijo de N2. Ej.: Prefijo(12,123)= S - Prefijo(12,12)= S - Prefijo(12,132)= No. 2. Ver si N1 es sufijo de N2. Ej.: Sufijo(12,312)= S - Sufijo(12,12)= S - Sufijo(12,132)= No.

EJERCICIO 8. Escriba un planteo recursivo para dibujar una media pirmide de dgitos como se muestra en
la siguiente figura. 1 21 321 4321 54321 654321 7654321 87654321 987654321

Nota: Puede resultarle muy til realizar un planteo recursivo para dibujar una fila de la media pirmide.

EJERCICIO 9. Dada una secuencia de nmeros enteros positivos finalizada en -1, escriba un planteo
recursivo para: 1. Sumar todos los enteros de dichas secuencia, sin incluir el -1. Ej.: Para la secuencia 2 5 3 6 12 3 -1 el resultado es 31 2. Determinar el mnimo entero perteneciente a la secuencia. Ej.: Para la secuencia 2 5 3 6 12 3 -1 el resultado es 2

EJERCICIO 10. Escriba planteos recursivos para:


1. Determinar cul es el inverso de una cadena de caracteres finalizada en '.' Ej.: si la cadena es 'animal.', su inverso es 'lamina'. 2. Contar cuntas palabras tiene una frase dada. Puede asumir que la frase tiene al menos una palabra. Ej.: si la frase ingresada es QUE LINDO DA., deber devolver 3.

EJERCICIO 11. Definimos inverso simple de una secuencia de caracteres, al inverso de la secuencia sin
sus repeticiones consecutivas. Por ejemplo, el inverso simple de aaabccdddaaebb es beadcba. Escriba un planteo recursivo para obtener el inverso simple de una secuencia de caracteres conociendo su longitud.

EJERCICIO 12. Dado un nmero entero N, escriba un planteo recursivo para determinar cuntos dgitos
pares ocupan posiciones impares (de izquierda a derecha) en N. Ej.: para N=22005 el resultado es 2. Para N=1414 , el resultado es 0

EJERCICIO 13. Los habitantes de Saign - ciudad capital de Vietman del Sur - no son tan pacientes como
los de Hanoi. En consecuencia, decidieron mejorar el juego de Hanoi agregando una torre adicional a las tres torres del juego tradicional. De esta forma, se disponen de 4 torres en total, pudiendo utilizarse dos de ellas como soporte auxiliar. Escriba un planteo recursivo que indique las movidas a realizar en el juego de torres de Saign para mover los discos de la torre 1 a la torre 4.

ELEMENTOS DE PROGRAMACIN - 1ER CUATRIMESTRE DE 2001 - U.N.S. PROFESOR: CARLOS IVN CHESEVAR ASISTENTE: ANDREA SILVETTI

TRABAJO PRCTICO N 1 (SEGUNDA PARTE) RECURSIVIDAD: IMPLEMENTACIN EN PASCAL


EJERCICIO 1. Implemente funciones o procedimientos recursivos en Pascal para implementar cada uno de
los problemas presentados en la primera parte del prctico 1. La implementacin debe respetar el planteo efectuado en cada caso. Esto es, una implementacin recursiva que resuelve el problema, no ser correcta si no se corresponde con lo esxpresado en el planteo. Comentarios en general: Resuelva el ejercicio 6 de dos maneras diferentes: Devolviendo el correspondiente nmero binario en una variable de tipo Longint. Simplemente imprimiendo en pantalla el correspondiente nmero binario. En ejercicio 10 inciso 1: deber imprimir en pantalla el inverso de una secuencia de caracteres finalizada en '.' que el usuario ingresar por teclado. inciso 2: la frase la ingresa el usuario por teclado. Para el ejercicio 11, considere que la longitud de la secuencia a procesar es un parmetro de entrada Long. La implementacin deber imprimir el inverso simple de una secuencia de longitud Long que el usuario ingresa por teclado.

EJERCICIO 2. En el ejercicio 5 de la primera parte del prctico 1 definimos nmero promedio de un


nmero positivo al nmero que se obtiene de sumar sus dgitos impares y restar sus dgitos pares. Utilice recursin mutua para escribir un nuevo planteo y su correspondiente funcin en Pascal para obtener el nmero promedio un N dado.

EJERCICIO 3. Utilice recursin mutua para determinar si un nmero positivo N es par, usando como pista
la siguiente afirmacin: Un nmero N es par si su predecesor es impar; un nmero N es impar si su predecesor es par. Escriba el planteo recursivo y su correspondiente implementacin en Pascal.

EJERCICIO 4. Dados dos nmeros N y B, tales que B<N, podemos hacer que N explote usando a B como
bomba. Cuando N explota se parte en dos nmeros N1=(N div B) y N2=N-(N div B). Pero B produce una reaccin en cadena: si N1 (y/o N2) es mayor que B, tambin explota y se parte nuevamente en dos pedazos, segn el criterio anterior. Esto se repite hasta que todos los pedazos resultantes a partir de N sean menores o iguales que B. Ej,: si N=15, y la bomba B=3, el nmero N se parte inicialmente en dos: 15 div 3, y 15-(15 div 3), es decir, 5 y 10. Como ambos son mayores que la bomba, deben estallar en dos. El proceso se repite segn lo muestra la figura. Escriba un procedimiento recursivo Explotar, que dado un nmero N y un nmero bomba B, imprima todos los pedazos que quedan al explotar N usando B. Ej.: En el caso que muestra la figura, deber imprimirse 1,1,3,3,2,1,1,3

EJERCICIO 5. (OPCIONAL) Escribir una funcin EvaluarExpBooleana para evaluar una expresin booleana, cuya definicin est dada por el siguiente diagrama sintctico:

Las letras v y f representan el valor verdadero (true) y falso (false) respectivamente. Los operadores + , * y # corresponden a las operaciones lgicas O (or), Y (and) y No (not) que tienen asociadas las siguientes tablas de verdad. X f f v v Y f v f v X+Y f v v v X f f v v Y f v f v X*Y f f f v X f v #X v f

La funcin al ser invocada, deber leer por teclado una cadena de caracteres, y retornar el valor asociado a la misma. Ej.: para la expresin (v + # (f * v ) + f ) el valor asociado es v y para la expresin v * f + f el valor asociado es f. Nota: se asume que la expresin a evaluar es sintcticamente correcta (esto es, toda expresin ingresada est formada respetando el diagrama anterior).