[ Foro de Pascal ]
Hola, yo de nuevo...
Tengo que hacer un programa que imprima todas las cadenas de n bits
pero no me funciona algo...
este es mi codigo:
program cadenadebit(input,output);
const MAXN = 10;
type tipoarreglo= array[1..MAXN] of integer;
var
a: tipoarreglo;
n: integer;
procedure haceralgo(a:tipoarreglo; n:integer);
begin
if(n>1) then haceralgo(a,n-1);
write(a[n]:6)
end;
procedure cadena(k: integer);
var i: integer;
begin
for i := 0 to 1 do begin
a[k] := i; (* poner 0 o 1 en el lugar k *)
if (k < n) then cadena(k+1)
else begin haceralgo(a, n); writeln end; (* hacer algo cuando k = n *)
end (* for *)
end;
begin
writeln('** impresion de cadenas de n bits');
writeln('ingresar la longitud de la cadena de bits');
readln(n);
cadena(n);
writeln;writeln('** Fin **')
end.
cuando lo ejecuto por ejemplo con n=2 me imprime en pantalla
los siguientes arreglos:
0 0
0 1
me faltaría que imprima 1 0 y 1 1.
Gracias!!!
Listo!!!
ya me di cuenta...lo que hice mal es en vez de poner cadena(n) debería poner cadena(1) lo que pasa que es recursiva pero al revés.
Saludos.
Me surgió esta duda en el procedimiento cadena precedente se va «hacia adelante», llamando a cadena(1) en el cuerpo principal, y aumentando el valor del argumento k en cada llamada del procedimiento hasta llegar a k = n , ya que n es global.
Esto contrasta con el uso de recursión en donde vamos «hacia atrás» disminuyendo el valor del argumento en cada llamada.
¿ cómo puedo redefinir el procedimiento cadena de modo que en él se compare k con 0 o 1 en vez de n , y se haga la llamada cadena(n) en el cuerpo principal?
Muchas Gracias.
Hola.
Pues creo que poniendo en el procedimiento cadena, en la instrucción que indica "k + 1", cambiarlo por "k-1". La cocdición a dicha instrucción también debería cambiar entonces a "0 < k" (si no, se volvería negativo el valor de "k"). Pruébalo, pero tampoco lo he pensado mucho...:-P
Por cierto, te recomiendo que no utilices variables globales (las que has puesto antes de los procedimientos). ¿Por qué? Pues porque muchas veces, si el programa es un poco largo, sin darte cuenta las modificas y luego pierdes el valor que te interesaba. Por ello, te aconsejo que las sitúes justo antes del programa principal, y las pases como parámetros a los procedimientos. Conseguirás además hacer tu programa más estructurado y los procedimientos más modulados.
Ciao.
Gracias Antonio pero no funciono tu sugerencia, de todos modos entendí bastante bien esto de la recursividad...tanto que me olvide lo anterior(jejeje).
Resolver el problema lo anterior sin usar recursión, usando que las cadenas de bits de longitud n pueden pensarse como los coe?cientes en base 2 de los números entre 0 y 2^( n ? 1). Sugerencia: para k = 0, . . . , 2^( n ? 1), construir la lista de coe?cientes en base 2 e imprimirla.
Si me das una idea Agradecido, sino también. Saludos.
PD: el viernes posteo como me fue...pero sea lo que sea estoy aprendiendo mucho.
Hola.
No entiendo tu último mensaje. Bueno, entiendo la parte en la que dices que no funcionó mi aportación (aunque no me sorprende... :-P).
Hasta luego.
(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)