[ Foro de Pascal ]

cadena de bits

14-Dec-2010 12:43
Emanuel Bazan
5 Respuestas

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!!!


14-Dec-2010 15:23
Emanuel Bazan

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.  


14-Dec-2010 18:55
Emanuel Bazan

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.


15-Dec-2010 00:42
Antonio P.G.

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.


15-Dec-2010 02:26
Emanuel Bazan

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.


15-Dec-2010 18:24
Antonio P.G.

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.)