Pascal/Turbo Pascal - Recursión

 
Vista:

Recursión

Publicado por José G (8 intervenciones) el 01/11/2003 02:05:23
Agradezco si alguien me puede indicar como ayudarme para realizar un programa que dado un número telefónico se pueda conseguir la combinación de letras que resultan en un panel de un telefono.
gracias...
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Recursión

Publicado por Morito (176 intervenciones) el 01/11/2003 03:23:48
Debes explicar mejor y te ayudo.

Es un teléfono que al escribirlo lo pase a alfa númerico?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Recursión

Publicado por joséG (8 intervenciones) el 01/11/2003 23:09:23
Sabés, en el panel de los telefonos puedes ver que hay unas letras asociadas a cada número(Ej. 2: ABC). Debes haber notado, por ejemplo, que muchas empresas ahora publicitan sus numeros de atención con cosas como: 800-talcosa, donde "talcosa" representa en ese panel unos números. Lo que deseo hacer es escribir un programa en pascal que sea capaz de conseguir las combinaciones de letras que resultan de colocar cualquier telefono(numero). Es decir ingreso un número y luego calculo todas las combinaciones de letras asociadas a ese número de acuerdo al panel citado.
Yo escribí este código, la cual consigue esa combinación con un caso espécifico (8 numeros) y luego pretendí colocar una cadena de caracteres en una linea de comando, donde se indicara la combinación de vectores que el numero "entrado" genera, olvidando que escribiría la cadena talcual y no su indicación. Espero me puedas ayudar, lo que la lógica me indica es que me encuentro ante un algoritmo recursivo que es bastante dificil.
Gracias JoséG.
program Perm (input, output);
uses crt;
var
archivo:text;
nombrea:string;
i,cont,cont2,cuenta,a,b,c,d,e,f,g,h,x,y : integer;
vv2,vv3,vv4,vv5,vv6,vv7,vv8,vv9:integer;
V2,V3,V4,V5,V6,V8 : Array [1..3] of char;
V7,V9 : Array [1..4] of char;
Nuntel : Array [1..10] of char;

texto1,texto: String;

Procedure Leenum;
Begin
read(nuntel[cont2+1]);
cont2:=cont2+1;
if not eoln then leenum;
end;
procedure encontrar;
begin
for i:= 1 to cont do
begin
if (nuntel[i%
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Recursión

Publicado por joseg (8 intervenciones) el 01/11/2003 23:12:27
program Perm (input, output);
uses crt;
var
archivo:text;
nombrea:string;
i,cont,cont2,cuenta,a,b,c,d,e,f,g,h,x,y : integer;
vv2,vv3,vv4,vv5,vv6,vv7,vv8,vv9:integer;
V2,V3,V4,V5,V6,V8 : Array [1..3] of char;
V7,V9 : Array [1..4] of char;
Nuntel : Array [1..10] of char;

texto1,texto: String;

Procedure Leenum;
Begin
read(nuntel[cont2+1]);
cont2:=cont2+1;
if not eoln then leenum;
end;
procedure encontrar;
begin
for i:= 1 to cont do
begin
if (nuntel[i]='2') and (i=1) or (nuntel[i]='3') and (i=1)
or (nuntel[i]='4') and (i=1) or (nuntel[i]='5') and (i=1)
or (nuntel[i]='6') and (i=1) or (nuntel[i]='8') and (i=1) then
begin
vv2:=3;
end;
if (nuntel[i]='7') and(i=1) or (nuntel[i]='9') and (i=1) then
begin
vv2:=4;
end;
if (nuntel[i]='2') and (i=2) or (nuntel[i]='3') and (i=2)
or (nuntel[i]='4') and (i=2) or (nuntel[i]='5') and (i=2)
or (nuntel[i]='6') and (i=2) or (nuntel[i]='8') and (i=2) then
begin
vv3:=3;
end;
if (nuntel[i]='7') and(i=2) or (nuntel[i]='9') and (i=2) then
begin
vv3:=4;
end;
if (nuntel[i]='2') and (i=3) o
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Recursión

Publicado por Diego Romero (786 intervenciones) el 02/11/2003 01:48:02
Mira, no suelo hacer esto pero me causó curiosidad tu problema e intenté resolverlo a mi manera, luego de ver tu código me pareció que era exesivamente complicado para algo tan simple, esta es mi solución en forma iterativa:
uses crt;

type
TLetras=Set of char;
TArray=Array[2..9] of TLetras;

const

Letras:TArray=(['A','B','C'],['D','E','F'],['G','H','I'],['J','K','L'],
['M','N','O'],['P','Q','R','S'],['T','U','V'],['W','X','Y','Z']);

var
Telef: String[8];
i, idx: integer;
encontrado: boolean;

begin
Write('Telefono: ');
ReadLn(Telef);

for i:=1 to length(Telef) do
begin
idx:=2;
encontrado:=false;
while (encontrado = false) and (idx < 10) do
begin
if Telef[i] in Letras[idx] then
encontrado:=true
else inc(idx);
end; { while }
if idx < 10 then Write(idx);
end; { for }
readkey;
end.

Cuidado que no estoy haciendo ninguna validación y la cadena de letras debe ingresarse en mayúsculas. Lo que no entiendas me lo preguntas.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Recursión

Publicado por JoséG (8 intervenciones) el 02/11/2003 19:35:18
Hola Diego, Gracias. Entendí tu solución(como entendiste el problema). Ya lo había lo hecho para ese caso(arreglos), aunque la tuya es muchisimo mejor(utilidad de conjuntos y arreglos). No osbtante, la cosa no para allí, justamente lo que busco es el caso contrario, es decir, dado el número(no su palabra relacionada) conseguir las diferentes combinaciones de letras (palabras) que resultan de dicho número. Exactamente el inverso de lo que me enviaste.
Si me puedes ayudar te lo agradezco, estoy programando en pascal y deseo aprender recursión bien. Me he planteado este problema, por que sé que es un interesante caso de recursión.
saludos JoséG
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Recursión

Publicado por Diego Romero (786 intervenciones) el 02/11/2003 21:37:08
Pero... te das cuenta que si partes del número puedes obtener miles de conbinaciones distintas de letras?, si parto de un número que es de 8 cifras y hago permutación fija con variación obtengo cientos de conbinaciones de letras. Si ese es el problema a resolver, es decir obtener todas las combinaciones posibles entonces vamos a ver qué se puede hacer.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Recursión

Publicado por Diego Romero (786 intervenciones) el 02/11/2003 21:46:32
Yo de nuevo. Hay un problema inherente el cual es que tienes grupos de tres y de cuatro letras, esto hace bastante complicado pasar esos grupos como parámetros de una función recursiva, a no ser que se usen lista con punteros que obviamente tiene que ser cargada y administrada, solo para poder hacer recursividad, me parece excesivo para este problema.
La otra es crear un tipo de dato nuevo tal como
TGrupo=record
Letras:string[4];
Max: byte;
end;
donde Letras guardará las letras de una cifra y Max tendrá la cantidad de letras almacenadas (3 o 4) y luego trabajar a partir de ahí.
Otro problema es la cifra '1' que no tiene correspondencia con ninguna letra ¿cómo se tratará esta cifra?, supongo que como un espacio pero en la vida real no hay teléfonos en letras con espacios (¿o sí?).
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Recursión

Publicado por JoséG (8 intervenciones) el 03/11/2003 14:44:48
Veras, los números 0 y 1 se validaran a la entrada(eso no es problema). de hecho puedo no tomarlos en cuenta. Lo que es importante son las combinaciones posibles de letras de los números del 2 al 9, que en algunos casos daran palabras con sentido, segun un diccionario, donde se podrian buscar. Pero esto es otro cuento. Por los momentos me interesas las combinaciones posibles. Éstas, una vez obtenidas las paso a un archivo de texto y alli las reviso. Honestamente lo que me ha detenido mucho son los casos de los números 7 y 9 que poseen cuatro letras asociadas, eso me ha imposibilitado aplicar un algoritmo recursivo(dado mi nivel en esto). Verdad que es interesante?.
José G
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Recursión

Publicado por Diego Romero (786 intervenciones) el 03/11/2003 18:23:59
Ciertamente que sí :)
¿Leiste mi correo?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Recursión

Publicado por JoséG (8 intervenciones) el 03/11/2003 20:23:10
Si leí tu correo y estoy intentando.
José G.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Recursión

Publicado por JoseG (1 intervención) el 04/11/2003 16:01:09
Hola Diego. No he podido resolver el problema. Cómo andas tú?.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Recursión

Publicado por Diego Romero (786 intervenciones) el 04/11/2003 18:52:34
Ni bién tenga un tiempito le dedico algo a este problema.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Recursión

Publicado por JoséG (8 intervenciones) el 12/11/2003 17:21:58
Hola Diego:
Estoy de vuelta. Mira este código. Es parecido a lo que me indicaste. No lo hice con registros y, coloque una matriz regular para probar sin mayores complicaciones. Como verás consigo las combinaciones de los dos primeros dígitos. De allí no he podido pasar.
Puedes ayudarme?
Saludos JoséG

Program PanelTelefono;
uses crt;
const
Panel:Array [1..4,2..9] of CHAR= (('A','D','G','J','M','P','T','W'),
('B','E','H','K','N','Q','U','X'),
('C','F','I','L','O','R','V','Y'),
(' ',' ',' ',' ',' ','S',' ','Z'));
VAR
tel:string;
f,ind,cant,i,j,a,error:integer;
v:array[1..8] of integer;

Procedure Telefono;
Var
Cadena:string;
i:integer;
Begin
Cadena:='';
If f=4 then
Begin
End
Else
Begin
For i:=1 to length(tel) do
Cadena:=Cadena+panel[f,v[i]];
Begin
For j:=1 to 4 do
begin
Cadena[length(tel)]:=panel[j,v[length(tel)]];
Write(cadena);
Writeln;
end;
End;
inc(f);
Telefono;
end;
End;

Begin
clrscr;
ind%3
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Recursión

Publicado por JoséG (8 intervenciones) el 20/11/2003 17:16:45
Gracias Diego, Saludos.
JGR
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar