Mira aquí te escribo lo que me mandaron en la universidad "la mayoría de los teléfonos móviles incorporan en su teclado numérico (excepto en las teclas 0 y 1 ) una serie de letras, las cuales permiten componer mensajes de texto o recordar números de teléfonos mediante la palabra que lo compone (por ejemplo es más fácil recordar "miercoles" que "643726537" .
Sobre la base de esta información implante un programa en pascal donde emplee una función recursiva que, dado un numero escriba por pantalla todas las posibles palabras que corresponden con dicho numero (utilice números pequeños)." No tengo ni la más mínima idea de como hacerlo te agradezco cualquier ayuda saludos
1 respuesta
Respuesta de burraburiash
1
1
burraburiash, Bueno, sobre todo me gusta la computación
En base a lo que te contesté antes, te diría que primero, antes que pensar en la recursividad, pienses en los pequeños problemas. Por ejemplo: 1) Tenemos 10 números (0.. 9). Necesitamos algún medio para que dado un número nos retorne las posibles letras por las que se reemplaza. Pensemos opciones: - Una función que dado un número me retorne la lista de letras. - Alguna implementación con un Array. RESULTADO: yo particularmente me quedo con la segunda. LETRAS = Array [0..9] of String[3]; Lo que esto dice es que hay 10 teclas y por cada una un máximo de 3 letras. Obviamente falta inicializar cada tecla. ¿Por qué un String[3]?, bueno es un medio que me permite variar entre 0 y 3 letras sin tener que escribir una línea código. Así, si una tecla no tiene letras se le pone '', mientras que al 2 le corresponde 'abc' y así. 2) No creo que haga falta nada más a modo de subproblema por ahora. Programa FINAL: Siempre tenés que pensar en lo que querés como resultado. Identificar pequeños problemas y resolverlos. Una vez que tenés las pequeñas cosas podes empezar a crear para arriba. Yo me imagino el problema como un listado donde se imprime en cada renglón una combinación distinta y al final cuenta la cantidad de combinaciones. De momento lo que resolvería el problema (a primera vista), sería una función que, dado un número, me imprima las combinaciones posibles y devuelva la cantidad de combinaciones encontradas. function Combinaciones(num : String) : Integer Ahora bien, sabemos que tenemos que recorrer todo el string. Intuitivamente pensamos en un FOR de este tipo FOR i := 1 TO length(num) DO Pero si te ponés a pensar un poco vas a ver que lo que sigue es complicado. Bastante más complicado si lo pensamos en términos de iteraciones anidadas. Tratá de hacer una solución con For, while y repeat anidados y me contás. Sin embargo podemos pensarlo recursivamente. Para ello tenemos que determinar un patrón de recursión. En este caso podríamos hacer recursión en el número de elementos como habíamos pensado originalmente. Como es en el NÚMERO tenemos dos casos a considerar: - El caso de la longitud 0 - El caso de la longitud n > 0 Fíjate Supongamos que el string es '': function Combinaciones (num : String) : Integer; begin if length(num) = 0 then Combinaciones := 0 else {lo que venga cuando n > 0} end; Ahora pensemos en el tema de la recursión. Generalmente pensamos en cómo resolver el caso inmediatamente siguiente al caso base. En este caso, el de longitud 1. Por ejemplo el String '2': function Combinaciones (num : String) : Integer; VAR i : Integer; begin if length(num) = 0 then Combinaciones := 0 else begin FOR i := 1 TO length(LETRAS[XXXXXXXXX]) DO BEGIN Write(LETRAS); INC(Combinaciones); END; end; end; Acá hacemos la primer modificación. Las XXX son el índice al que corresponde el número que me dan como parámetro. El índice es INTEGER y el dígito que analizamos es CHAR. O adaptamos el CHAR a un INTEGER o a la inversa. Nuevamente tomo la segunda opción y redefino LETRAS para que sea todo más rápido: LETRAS = Array ['0'..'9'] of String[3]; Ahora sí: function Combinaciones (num : String) : Integer; VAR i : Integer; begin if length(num) = 0 then Combinaciones := 0 else begin FOR i := 1 TO length(LETRAS[num[1]]) DO BEGIN Write(LETRAS); INC(Combinaciones); END; end; end; Fijate que como te dije sólo analizamos el primer número, por eso puse num[1] en el FOR. Ahora falta ubicar la recursión. Como ya resolvimos el tema de un dígito, lo que nos queda es concatenar el primer dígito con lo que resulta de los siguientes y lo hacemos literalmente: function Combinaciones (num : String) : Integer; VAR i : Integer; begin if length(num) = 0 then Combinaciones := 0 else begin Combinaciones := 0; FOR i := 1 TO length(LETRAS[num[1]]) DO BEGIN Write(LETRAS); Combinaciones := Combinaciones + Combinaciones(Copy(num,2,length(num)); END; end; end; Lo anterior ya es un ejercicio resuelto. Pero podemos optimizarlo un poco y emprolijar el formato de la salida: function Combinaciones (num : String) : Integer; VAR i : Integer; begin Combinaciones := 0 if length(num) = 0 then WriteLn; else begin FOR i := 1 TO length(LETRAS[num[1]]) DO BEGIN Write(LETRAS); Combinaciones := Combinaciones + Combinaciones(Copy(num,2,length(num)); END; end; end; Para terminar, acordate que LETRAS['0']='0' y LETRAS['1']='1'.