Fecha y hora actual: Miércoles 22 Ene 2020 07:50
Índice del Foro

Foros de programación informática, diseño gráfico y Web

En esta comunidad intentaremos dar soporte de programación a todos los niveles, desde principiantes a profesionales de la informática, desarrollo de programas, programación web y mucho más.

Programando desde 0: 38- Ejercicios de recursividad.

Responder al Tema Ir a página Anterior1234Siguiente

Índice del Foro > Programación en general > Programando desde 0: 38- Ejercicios de recursividad.

Autor Mensaje
Kyshuo Ayame
Moderador Global


Registrado: 07 Ene 2011
Mensajes: 1046

Mensaje Publicado: Lunes 07 Oct 2013 03:40

Título del mensaje: Re: Programando desde 0: 38- Ejercicios de recursividad.

Responder citando

Un trabajo excelente!!! Veo que vas a un ritmo espectacular...

Sigue así!!! Un saludo.

Ok

Volver arriba
Ver perfil del usuario Enviar mensaje privado
xRoki
Usuario Inquieto


Registrado: 22 Ago 2013
Mensajes: 71

Mensaje Publicado: Lunes 07 Oct 2013 22:57

Título del mensaje: Re: Programando desde 0: 38- Ejercicios de recursividad.

Responder citando

EJERICICIO 6 XD

Código:
PROCEDURE OrdenarLista(VAR l :Tipos);
VAR
a:INTEGER;
BEGIN


IF l^.siguiente<>NIL THEN
IF l^.numero>l^.siguiente^.numero THEN

a:=l^.numero;
l^.numero:=l^.siguiente^.numero;
l^.siguiente^.numero:=a;
OrdenarLista(l^.siguiente);

ELSIF l^.numero<l^.siguiente^.numero THEN

OrdenarLista(l^.siguiente);


END;







END;



IF l^.siguiente<>NIL THEN
IF l^.numero>l^.siguiente^.numero THEN

a:=l^.numero;
l^.numero:=l^.siguiente^.numero;
l^.siguiente^.numero:=a;
OrdenarLista(l^.siguiente);

ELSIF l^.numero<l^.siguiente^.numero THEN

OrdenarLista(l^.siguiente);


END;







END;



END OrdenarLista;




EJERCICIO 7

Es algo rara pero funciona , solo al principio se igresa c como Falso xD ... trate de hacerlo sin q fuera ahi xd y solo colocarlo de variable pero me daba algo mal o_O ya que aveces se tomaba c true o false xd

Código:
PROCEDURE Merge( VAR l1 :Tipos; VAR l2 :Tipos; c :BOOLEAN);
VAR
a: INTEGER;


BEGIN

IF c=FALSE THEN
IF (l1^.siguiente<>NIL) THEN

Merge(l1^.siguiente,l2,c);

ELSIF (l1^.siguiente=NIL) AND (l2<>NIL) THEN

NEW(l1^.siguiente);

l1^.siguiente^.numero:=l2^.numero;

Merge(l1^.siguiente,l2^.siguiente,c);





END;
END;


IF (l1^.siguiente<>NIL) AND (l2^.siguiente<>NIL)  THEN

l2:=l1;
c:=TRUE;

IF l1^.numero>l1^.siguiente^.numero THEN

a:=l1^.numero;
l1^.numero:=l1^.siguiente^.numero;
l1^.siguiente^.numero:=a;

END;

Merge(l1^.siguiente,l2^.siguiente,c);


END;


END Merge;


EJERCICIO 8

invertir me costo asi que hice una pequeña loquera perdon jaja xd





Código:

PROCEDURE InvertiryMaximo(VAR l : Tipos ; VAR a: secuencia ; VAR i,p: INTEGER);
VAR
p1: INTEGER;
BEGIN
i:=i+1;
IF l^.siguiente<>NIL THEN

a[i]:=l^.numero;

Invertir(l^.siguiente,a,i,p);

ELSE
a[i]:=l^.numero;

END;
p:=p+1;

l^.numero:=a[p];










END Invertir;



Ejercicio 9

Código:

PROCEDURE Maximo( l : Tipos ): INTEGER;
BEGIN

IF l^.siguiente<>NIL THEN

RETURN Maximo(l^.siguiente)+1;

ELSE

RETURN 1;
END;

END Maximo;


OK termine la parte media xd [/code]

Volver arriba
Ver perfil del usuario Enviar mensaje privado
Kyshuo Ayame
Moderador Global


Registrado: 07 Ene 2011
Mensajes: 1046

Mensaje Publicado: Lunes 07 Oct 2013 22:59

Título del mensaje: Re: Programando desde 0: 38- Ejercicios de recursividad.

Responder citando

Solo por curiosidad ¿has probado todos los códigos?

Volver arriba
Ver perfil del usuario Enviar mensaje privado
xRoki
Usuario Inquieto


Registrado: 22 Ago 2013
Mensajes: 71

Mensaje Publicado: Lunes 07 Oct 2013 23:17

Título del mensaje: Re: Programando desde 0: 38- Ejercicios de recursividad.

Responder citando

claro xD yo los compruebo mil veces con Native XDS ... porque lo dices???

a y podrias explicarme la 10 porfavor no entendi la parte de .. 'Por ejemplo, el número de caminos posibles para n=3 es 3 y son los siguientes: (0,1,2,3), (0,2,3) y (0,1,3).'

y como ya as visto me as visto progresar xD podrias darme una opnion si no e smolestias:D es q casi siempre respondo xD jajajja y quedo sin poder comunicarme contigo jajaja . Tengo 16 años xxd cumplidos ahce unos dias jajaja xD

Volver arriba
Ver perfil del usuario Enviar mensaje privado
xRoki
Usuario Inquieto


Registrado: 22 Ago 2013
Mensajes: 71

Mensaje Publicado: Miércoles 09 Oct 2013 01:43

Título del mensaje: Re: Programando desde 0: 38- Ejercicios de recursividad.

Responder citando

hice recursion y los entendi perfectamente xdpero los q hice casi todos los ejercicios menos los muy dificiles xD es q quiero avanzar ya :D y ya me parti la cabeza haciend los demas jajajaja

Volver arriba
Ver perfil del usuario Enviar mensaje privado
Kyshuo Ayame
Moderador Global


Registrado: 07 Ene 2011
Mensajes: 1046

Mensaje Publicado: Miércoles 09 Oct 2013 01:55

Título del mensaje: Re: Programando desde 0: 38- Ejercicios de recursividad.

Responder citando

Pues pregunté justamente porque avanzas muy rápido y eso está genial, pero a veces algunos publican códigos sin revisar en su afán por ir a la siguiente lección.

Vas muy bien, excelente diría yo. La mayoría desiste al llegar a estos temas tan complejos pero tú no, es más, parece que estás super emocionado.

Sigue adelante.

Un saludo.

Volver arriba
Ver perfil del usuario Enviar mensaje privado
jlrods
Usuario Inquieto


Registrado: 03 May 2014
Mensajes: 60

Mensaje Publicado: Domingo 05 Abr 2015 13:42

Título del mensaje: Programando desde 0: 38- Ejercicios de recursividad.

Responder citando

Ejercicio 1:

Código:

MODULE E1FuncionSonIguales;
FROM SWholeIO IMPORT WriteCard, ReadCard;
FROM STextIO IMPORT WriteString, WriteLn, SkipLine;
FROM Storage IMPORT ALLOCATE;

TYPE
TipoLista = POINTER TO NodoLista;

NodoLista = RECORD
  elem: CARDINAL;
  sig: TipoLista;
END;

VAR
Lista1, Lista2,aux: TipoLista;
i, MaxLista1, MaxLista2: CARDINAL;

PROCEDURE SonIguales(L1, L2: TipoLista): BOOLEAN;
VAR
iguales: BOOLEAN;
BEGIN
  IF  (L1=NIL) AND (L2=NIL) THEN
    iguales:= TRUE;
  ELSIF (MaxLista1<>MaxLista2) THEN
    iguales:= FALSE;
  ELSIF (L1^.elem<>L2^.elem) THEN
    iguales:= FALSE;
  ELSIF ((L1^.sig=NIL)AND(L2^.sig=NIL)) AND (L1^.elem=L2^.elem)  THEN
     iguales:= TRUE;
  ELSE
    iguales:= SonIguales(L1^.sig,L2^.sig);
  END;
  RETURN iguales;
END SonIguales;

BEGIN
WriteString("Por favor ingrese un numero para indicar el maximo de la Lista 1:"); WriteLn;
WriteString("---> ");
ReadCard(MaxLista1); SkipLine;
IF (MaxLista1<> 0) THEN
  NEW(Lista1);
  WriteString("Ingrese cuando se le indique en cada linea un numero de la lista 1:");WriteLn;
  aux:= Lista1;
  FOR i:=0 TO (MaxLista1-1) DO
    WriteString("---> ");
    NEW(aux^.sig);
    aux:=aux^.sig;
    ReadCard(aux^.elem); SkipLine;
  END;
  aux^.sig:=NIL;
ELSE
  Lista1:= NIL;
END;
WriteLn; WriteLn;
WriteString("Por favor ingrese  un numero para indicar el maximo de la Lista 2:"); WriteLn;
WriteString("---> ");
ReadCard(MaxLista2); SkipLine;
IF (MaxLista2<>0) THEN
  NEW(Lista2);
  WriteString("Ingrese cuando se le indique en cada linea un numero de la lista 1:");WriteLn;
  aux:= Lista2;
  FOR i:=0 TO (MaxLista2-1) DO
    WriteString("---> ");
    NEW(aux^.sig);
    aux:=aux^.sig;
    ReadCard(aux^.elem); SkipLine;
  END;
  aux^.sig:=NIL;
ELSE
  Lista2:=NIL;
END;
WriteLn; WriteLn;
IF SonIguales(Lista1,Lista2) THEN
  WriteString("Ambas listas son iguales!!!");
  SkipLine;
ELSE
  WriteString("Las listas son diferentes!!!");
  SkipLine;
END;
END E1FuncionSonIguales.

Volver arriba
Ver perfil del usuario Enviar mensaje privado
jlrods
Usuario Inquieto


Registrado: 03 May 2014
Mensajes: 60

Mensaje Publicado: Domingo 05 Abr 2015 13:44

Título del mensaje: Programando desde 0: 38- Ejercicios de recursividad.

Responder citando

Ejercicio 2 y 3 juntos, es un mismo programa principal que invoca las funciones requeridas en cada ejercicio:

Código:

MODULE E2E3E4FuncionesListas;

FROM SWholeIO IMPORT WriteCard, ReadCard;
FROM STextIO IMPORT WriteString, WriteLn, SkipLine;
FROM Storage IMPORT ALLOCATE;

TYPE
TipoLista = POINTER TO NodoLista;

NodoLista = RECORD
  elem: CARDINAL;
  sig: TipoLista;
END;

VAR
Lista, aux: TipoLista;
i, MaxLista, elemento: CARDINAL;

PROCEDURE ExisteElemento(L: TipoLista; n: CARDINAL):BOOLEAN;
VAR
existe: BOOLEAN;
BEGIN
 IF(L^.sig=NIL) THEN
   IF (L^.elem=n) THEN
     existe:= TRUE
   ELSE
     existe:=FALSE;
   END;
 ELSIF(L^.elem=n) THEN
   existe:= TRUE;
 ELSE
  existe:=ExisteElemento(L^.sig,n);
 END;
 RETURN existe;
END ExisteElemento;

PROCEDURE Ocurrencia(L: TipoLista; n: CARDINAL): CARDINAL;
VAR
ocurrencia: CARDINAL;
BEGIN
  ocurrencia:=0;
  IF (L^.sig=NIL) THEN
    IF (L^.elem=n) THEN
      ocurrencia:=ocurrencia+1;
    END;
  ELSE
    ocurrencia:=Ocurrencia(L^.sig,n);
    IF(L^.elem=n) THEN
      ocurrencia:=ocurrencia+1;
    END;
  END;
  RETURN ocurrencia;
END Ocurrencia;

PROCEDURE Suma(L: TipoLista): CARDINAL;

VAR
suma: CARDINAL;

BEGIN
  suma:=0;
  IF (L^.sig=NIL) THEN
    suma:= suma+L^.elem;
  ELSE
    suma:=Suma(L^.sig);
    suma:=suma+L^.elem;
  END;
  RETURN suma;
END Suma;

BEGIN
WriteString("Por favor ingrese un numero para indicar el maximo de la Lista :"); WriteLn;
WriteString("---> ");
ReadCard(MaxLista); SkipLine;
IF (MaxLista<> 0) THEN
  NEW(Lista);
  aux:= Lista;
  WriteString("Ingrese cuando se le indique en cada linea un numero de la lista:");WriteLn;
  FOR i:=0 TO (MaxLista-1) DO
    WriteString("---> ");
    NEW(aux^.sig);
    aux:=aux^.sig;
    ReadCard(aux^.elem); SkipLine;
  END;
  aux^.sig:=NIL;
WriteLn; WriteLn;
ELSE
  Lista:= NIL;
   WriteString("La lista esta vacia!!!"); SkipLine;
END;
IF MaxLista<>0 THEN
  WriteString("Por favor ingrese un numero para verificar si esta en la Lista que ingreso:");   WriteLn;
  WriteString("---> ");
  ReadCard(elemento); SkipLine;
  WriteLn; WriteLn;
  IF (ExisteElemento(Lista,elemento)) THEN
    WriteString("El numero "); WriteCard(elemento,1); WriteString(" esta en la lista!!");
    WriteString(" y su frecuencia en la lista es: "); WriteCard(Ocurrencia(Lista,elemento),1);
  ELSE
    WriteString("El numero "); WriteCard(elemento,1); WriteString(" NO esta en la lista!!");
  END;
END;

IF MaxLista<>0 THEN
  WriteLn; WriteLn;
  WriteString("La suma de la lista es: "); WriteCard(Suma(Lista),1);
END;

SkipLine;
END E2E3E4FuncionesListas.

Volver arriba
Ver perfil del usuario Enviar mensaje privado
jlrods
Usuario Inquieto


Registrado: 03 May 2014
Mensajes: 60

Mensaje Publicado: Lunes 13 Abr 2015 15:07

Título del mensaje: Programando desde 0: 38- Ejercicios de recursividad.

Responder citando

Ejercicios del 2 al 6:

Código:

MODULE E2alE6FuncionesListas;
 
FROM SWholeIO IMPORT WriteCard, ReadCard;
FROM STextIO IMPORT WriteString, ReadChar, WriteLn, SkipLine;
FROM Storage IMPORT ALLOCATE, DEALLOCATE;
 
TYPE
TipoLista = POINTER TO NodoLista;
 
NodoLista = RECORD
  elem: CARDINAL;
  sig: TipoLista;
END;
 
VAR
Lista, aux: TipoLista;
i, MaxLista, elemento, posicion: CARDINAL;
opcion: CHAR;
 
PROCEDURE ExisteElemento(L: TipoLista; n: CARDINAL):BOOLEAN;
VAR
existe: BOOLEAN;
BEGIN
 IF(L^.sig=NIL) THEN
   IF (L^.elem=n) THEN
     existe:= TRUE
   ELSE
     existe:=FALSE;
   END;
 ELSIF(L^.elem=n) THEN
   existe:= TRUE;
 ELSE
  existe:=ExisteElemento(L^.sig,n);
 END;
 RETURN existe;
END ExisteElemento;
 
PROCEDURE Ocurrencia(L: TipoLista; n: CARDINAL): CARDINAL;
VAR
ocurrencia: CARDINAL;
BEGIN
  ocurrencia:=0;
  IF (L^.sig=NIL) THEN
    IF (L^.elem=n) THEN
      ocurrencia:=ocurrencia+1;
    END;
  ELSE
    ocurrencia:=Ocurrencia(L^.sig,n);
    IF(L^.elem=n) THEN
      ocurrencia:=ocurrencia+1;
    END;
  END;
  RETURN ocurrencia;
END Ocurrencia;
 
PROCEDURE Suma(L: TipoLista): CARDINAL;
 
VAR
suma: CARDINAL;
 
BEGIN
  suma:=0;
  IF (L^.sig=NIL) THEN
    suma:= suma+L^.elem;
  ELSE
    suma:=Suma(L^.sig);
    suma:=suma+L^.elem;
  END;
  RETURN suma;
END Suma;
 
PROCEDURE Eliminar(L: TipoLista;X:CARDINAL):TipoLista;
 
VAR
aux,temp: TipoLista;
 
BEGIN
 
  IF L=NIL THEN
    WriteString("La lista esta vacia!!!");
  ELSIF (L^.elem= X)THEN
    temp:= L;
    L:= L^.sig;
    DISPOSE (temp);
  ELSIF (L^.sig = NIL) AND (L^.elem<> X) THEN
    WriteString("El elemento que desea eliminiar no se encuentra en la lista!!!");
  ELSE
   aux:=Eliminar(L^.sig,X);
   L^.sig:= aux;
  END;
  RETURN L;
END Eliminar;
 
PROCEDURE InsertarOrdenado(L:TipoLista; X:CARDINAL): TipoLista;
 
VAR
temp, aux: TipoLista;
 
BEGIN
 
  IF L= NIL THEN
    WriteString("La lista esta vacia!!!");
  ELSIF (L^.sig = NIL) THEN
    IF (L^.elem<= X)THEN
      NEW(L^.sig);
      temp:= L^.sig;
      temp^.elem:= X;
      temp^.sig:=NIL;
    END;
  ELSIF (L^.elem>X) THEN
    NEW(temp);
    temp^.elem:=X;
    temp^.sig:=L;
    L:=temp;
  ELSIF (L^.elem<= X) AND (L^.sig^.elem>X) THEN
    temp:=L^.sig;
    NEW(L^.sig);
    L^.sig^.elem:= X;
    L^.sig^.sig:= temp;
  ELSE
    aux:=InsertarOrdenado(L^.sig,X);
  END;
 
  RETURN L;
END InsertarOrdenado;
 
PROCEDURE OrdenarLista(L:TipoLista): TipoLista;
 
VAR
temp: CARDINAL;
aux: TipoLista;
 
BEGIN
  IF L= NIL THEN
    RETURN L;
  ELSIF L^.sig = NIL THEN
    RETURN L;
  ELSIF L^.elem > L^.sig^.elem THEN
    temp:= L^.elem;
    L^.elem:= L^.sig^.elem;
    L^.sig^.elem:= temp;
    aux:= OrdenarLista(L^.sig);
    IF L^.elem > L^.sig^.elem THEN
     aux:= OrdenarLista(L);
    END;
    RETURN L;
  ELSE
     aux:= OrdenarLista(L^.sig);
     IF L^.elem > L^.sig^.elem THEN
       aux:= OrdenarLista(L);
     END;
     RETURN L;
  END;
 
END OrdenarLista;
 
BEGIN
WriteString("Por favor ingrese un numero para indicar el maximo de la Lista :"); WriteLn;
WriteString("---> ");
ReadCard(MaxLista); SkipLine;
IF (MaxLista<> 0) THEN
  NEW(Lista);
  aux:= Lista;
  WriteString("Ingrese cuando se le indique en cada linea un numero de la lista:");WriteLn;
  FOR i:=1 TO (MaxLista) DO
    WriteString("---> ");
    ReadCard(aux^.elem); SkipLine;
    NEW(aux^.sig);
    IF i<> MaxLista THEN
    aux:=aux^.sig;
    END;
 
  END;
  aux^.sig:=NIL;
WriteLn; WriteLn;
ELSE
  Lista:= NIL;
   WriteString("La lista esta vacia!!!"); SkipLine;
END;
IF MaxLista<>0 THEN
  WriteString("Por favor ingrese un numero para verificar si esta en la Lista que ingreso:");   WriteLn;
  WriteString("---> ");
  ReadCard(elemento); SkipLine;
  WriteLn; WriteLn;
  IF (ExisteElemento(Lista,elemento)) THEN
    WriteString("El numero "); WriteCard(elemento,1); WriteString(" esta en la lista!!");
    WriteString(" y su frecuencia en la lista es: "); WriteCard(Ocurrencia(Lista,elemento),1);
  ELSE
    WriteString("El numero "); WriteCard(elemento,1); WriteString(" NO esta en la lista!!");
  END;
END;
 
IF MaxLista<>0 THEN
  WriteLn; WriteLn;
  WriteString("La suma de la lista es: "); WriteCard(Suma(Lista),1);
END;
WriteLn; WriteLn;
WriteString("Indique si desea eliminar un elemento de la lista(S/N):"); WriteLn;
WriteString("--->");
ReadChar(opcion); SkipLine;
 
IF (opcion="S") THEN
  WriteString("Indique el elemento de la lista anterior que desea eliminar:"); WriteLn;
  WriteString("--->");
  ReadCard(elemento);
  Lista:=Eliminar(Lista,elemento);
  WriteString("La lista queda de la siguienete manera: "); WriteLn;
  WriteString("---> ");
  aux:=Lista;
  WHILE  aux <> NIL DO
    WriteCard(aux^.elem,1);
    WriteString(" ");
    aux:=aux^.sig;
  END;
  WriteLn; WriteLn;
  SkipLine;
ELSE
  WriteString("La lista queda igual!!!");
  SkipLine;
END;
 
WriteString("La lista esta ordenada en orden ascendente?(S/N)"); WriteLn;
WriteString("--->");
ReadChar(opcion); SkipLine;
IF opcion="S" THEN
  WriteString("Ingrese un numero para incluirlo en la lista ordenadamente:");
  WriteString("--->");
  ReadCard(elemento);
  Lista:= InsertarOrdenado(Lista,elemento);
  WriteString("La lista queda de la siguienete manera: "); WriteLn;
  WriteString("---> ");
  aux:=Lista;
  WHILE  aux <> NIL DO
    WriteCard(aux^.elem,1);
    WriteString(" ");
    aux:=aux^.sig;
  END;
  WriteLn; WriteLn;
  SkipLine;
ELSIF opcion="N" THEN
  WriteString("La lista sera ordenada de forma ascendete, presione ENTER para  proceder:"); SkipLine;
  WriteString("---> ");
  Lista:= OrdenarLista(Lista);
  aux:= Lista;
  WHILE  aux <> NIL DO
    WriteCard(aux^.elem,1);
    WriteString(" ");
    aux:=aux^.sig;
  END;
  WriteLn; WriteLn;
  WriteString("Ingrese un numero para incluirlo en la lista ordenadamente:");
  WriteString("--->");
  ReadCard(elemento);
  Lista:= InsertarOrdenado(Lista,elemento);
  WriteString("La lista queda de la siguienete manera: "); WriteLn;
  WriteString("---> ");
  aux:=Lista;
  WHILE  aux <> NIL DO
    WriteCard(aux^.elem,1);
    WriteString(" ");
    aux:=aux^.sig;
  END;
  SkipLine;
ELSE
  WriteString("Introdujo una opcion invalida");
  WriteLn; WriteLn;
  SkipLine;
END;
SkipLine;
END E2alE6FuncionesListas.

Volver arriba
Ver perfil del usuario Enviar mensaje privado
jlrods
Usuario Inquieto


Registrado: 03 May 2014
Mensajes: 60

Mensaje Publicado: Martes 14 Abr 2015 20:47

Título del mensaje: Programando desde 0: 38- Ejercicios de recursividad.

Responder citando

Ejercicios 7,8,9. Esta ultima ronda estuvo dificil, no me imagino los que siguien:



Código:

MODULE E7E8E9FuncionesListas;

FROM SWholeIO IMPORT WriteInt, ReadInt;
FROM STextIO IMPORT WriteString, ReadChar, WriteLn, SkipLine;
FROM Storage IMPORT ALLOCATE, DEALLOCATE;

TYPE
TipoLista = POINTER TO NodoLista;

NodoLista= RECORD
  elem: INTEGER;
  sig: TipoLista;
END;

VAR
Lista1, Lista2, Lista3, ListaUnida, aux: TipoLista;
MaxLista1, MaxLista2, MaxLista3,i: INTEGER;

PROCEDURE Merge(L1,L2: TipoLista): TipoLista;

VAR
aux, Merge: TipoLista;

PROCEDURE OrdenarLista(L:TipoLista): TipoLista;

VAR
temp: INTEGER;
aux: TipoLista;
BEGIN
  IF L= NIL THEN
    RETURN L;
  ELSIF L^.sig = NIL THEN
    RETURN L;
  ELSIF L^.elem > L^.sig^.elem THEN
    temp:= L^.elem;
    L^.elem:= L^.sig^.elem;
    L^.sig^.elem:= temp;
    aux:= OrdenarLista(L^.sig);
    IF L^.elem > L^.sig^.elem THEN
     aux:= OrdenarLista(L);
    END;
    RETURN L;
  ELSE
     aux:= OrdenarLista(L^.sig);
     IF L^.elem > L^.sig^.elem THEN
       aux:= OrdenarLista(L);
     END;
     RETURN L;
  END;
END OrdenarLista;

BEGIN
  IF (L1 <> NIL) AND (L2 = NIL) THEN
    Merge:= OrdenarLista(L1);
    RETURN Merge;
  ELSIF (L1= NIL) AND (L2<> NIL) THEN
    Merge:= OrdenarLista(L2);
    RETURN Merge;
  ELSIF (L1=NIL) AND (L2=NIL) THEN
    RETURN NIL;
  ELSE
    aux:= L1;
    WHILE aux^.sig <> NIL DO
      aux:= aux^.sig;
    END;
    aux^.sig:= L2;
    Merge:= OrdenarLista(L1);
    RETURN Merge;
  END;



END Merge;

PROCEDURE Invertir(L:TipoLista): TipoLista;

VAR
aux, nodo, p: TipoLista;

BEGIN

  IF L = NIL THEN
    RETURN L;
  ELSIF L^.sig= NIL THEN
    NEW(nodo);
    aux:=nodo;
    nodo^.elem:= L^.elem;
    nodo^.sig:= NIL;
    RETURN nodo;
  ELSE
    aux:= Invertir(L^.sig);
    NEW(nodo);
    nodo^.elem:= L^.elem;
    p:= aux;
    WHILE p^.sig<> NIL DO
      p:=p^.sig;
    END;
    p^.sig:= nodo;
    nodo^.sig:= NIL;
    RETURN aux;
  END;
END Invertir;

PROCEDURE Maximo(L: TipoLista): INTEGER;

VAR
Max: INTEGER;

BEGIN
  IF (L= NIL) THEN
    RETURN 0;
  ELSIF (L^.sig = NIL) THEN
    Max:= L^.elem;
    RETURN Max;
  ELSE
    Max:= Maximo(L^.sig);
    IF L^.elem > Max THEN
      Max:= L^.elem;
    END;
    RETURN Max;
  END;
END Maximo;


BEGIN
  WriteString("Ingrese dos listas de numeros enteros. Los numeros se ingresan separados, uno en cada linea cuando se le indique:"); WriteLn;
  WriteString("Ingrese la primera lista."); WriteLn;
  WriteString("Por favor ingrese un numero para indicar el maximo de la Lista 1 :"); WriteLn;
  WriteString("---> ");
  ReadInt(MaxLista1); SkipLine;
  IF (MaxLista1<> 0) THEN
    NEW(Lista1);
    aux:= Lista1;
    WriteString("Ingrese cuando se le indique en cada linea un numero de la lista 1:");WriteLn;
    FOR i:=1 TO (MaxLista1) DO
      WriteString("---> ");
      ReadInt(aux^.elem); SkipLine;
      NEW(aux^.sig);
      IF i<> MaxLista1 THEN
       aux:=aux^.sig;
      END;
    END;
    aux^.sig:=NIL;
    WriteLn; WriteLn;
  ELSE
   Lista1:= NIL;
   WriteString("La lista esta vacia!!!"); SkipLine;
  END;
  WriteLn; WriteLn;

  WriteString("Por favor ingrese un numero para indicar el maximo de la Lista 2 :"); WriteLn;
  WriteString("---> ");
  ReadInt(MaxLista2); SkipLine;

  IF (MaxLista2<> 0) THEN
    NEW(Lista2);
    aux:= Lista2;
    WriteString("Ingrese cuando se le indique en cada linea un numero de la lista 2:");WriteLn;

    FOR i:=1 TO (MaxLista2) DO
      WriteString("---> ");
      ReadInt(aux^.elem); SkipLine;
      NEW(aux^.sig);
      IF i<> MaxLista2 THEN
       aux:=aux^.sig;
      END;
    END;
    aux^.sig:=NIL;
    WriteLn; WriteLn;
  ELSE
   Lista2:= NIL;
   WriteString("La lista esta vacia!!!"); SkipLine;
   WriteLn; WriteLn;
  END;


  WriteString("A continiuacion se procedera an unir ambas listas y ordenarlas de forma ascedente!"); WriteLn;
  ListaUnida:= Merge(Lista1, Lista2);
  IF (ListaUnida<>NIL) THEN
    WriteString("La lista queda de la siguienete manera: "); WriteLn;
    WriteString("---> ");
    aux:=ListaUnida;
    WHILE  aux <> NIL DO
      WriteInt(aux^.elem,1);
      WriteString(" ");
      aux:=aux^.sig;
    END;
    WriteLn; WriteLn;
    WriteString("Ahora se presentara la lista unificada de manera invertida: "); WriteLn;
    WriteString("---> ");
    ListaUnida:= Invertir(ListaUnida);
    aux:=ListaUnida;
    WHILE  aux <> NIL DO
      WriteInt(aux^.elem,1);
      WriteString(" ");
      aux:=aux^.sig;
    END;
  ELSE
    WriteString("La lista esta vacia!!!");
  END;
  WriteLn; WriteLn;
  WriteString("Ingrese una nueva lista."); WriteLn;
  WriteString("Por favor ingrese un numero para indicar el maximo de la Lista 3 :"); WriteLn;
  WriteString("---> ");
  ReadInt(MaxLista3); SkipLine;
  IF (MaxLista3<> 0) THEN
    NEW(Lista3);
    aux:= Lista3;
    WriteString("Ingrese cuando se le indique en cada linea un numero de la lista 1:");WriteLn;
    FOR i:=1 TO (MaxLista3) DO
      WriteString("---> ");
      ReadInt(aux^.elem); SkipLine;
      NEW(aux^.sig);
      IF i<> MaxLista3 THEN
       aux:=aux^.sig;
      END;
    END;
    aux^.sig:=NIL;
    WriteLn; WriteLn;
  ELSE
   Lista1:= NIL;
   WriteString("La lista esta vacia!!!"); SkipLine;
  END;
  WriteLn; WriteLn;
  WriteString("El maximo de la lista es: ");WriteLn;
  WriteString("---> ");
  WriteInt(Maximo(Lista3),1);

  SkipLine;
  SkipLine;

END E7E8E9FuncionesListas.

Volver arriba
Ver perfil del usuario Enviar mensaje privado
Kyshuo Ayame
Moderador Global


Registrado: 07 Ene 2011
Mensajes: 1046

Mensaje Publicado: Miércoles 15 Abr 2015 15:02

Título del mensaje: Programando desde 0: 38- Ejercicios de recursividad.

Responder citando

Recursividad es un tema ultra complicado, pero una vez que lo dominas te salva la vida en muchas ocasiones. Por ejemplo, el juego Buscaminas propuesto al final de Pascal puede ser resuelto con recursividad de forma mucho más sencilla que mediante iteración.

Sigue así.

Volver arriba
Ver perfil del usuario Enviar mensaje privado
jlrods
Usuario Inquieto


Registrado: 03 May 2014
Mensajes: 60

Mensaje Publicado: Jueves 16 Abr 2015 10:17

Título del mensaje: Programando desde 0: 38- Ejercicios de recursividad.

Responder citando

Hola Kyshuo,

Una duda con respecto al ejercicio 10, dicha funcion solo debe decir el numero de caminos posibles, es decir la funcion retornara un numero natural? o ademas dede retornar los caminos que se pueden tomar?

Gracias.

Volver arriba
Ver perfil del usuario Enviar mensaje privado
Kyshuo Ayame
Moderador Global


Registrado: 07 Ene 2011
Mensajes: 1046

Mensaje Publicado: Jueves 16 Abr 2015 15:13

Título del mensaje: Programando desde 0: 38- Ejercicios de recursividad.

Responder citando

Un número natural, es decir un CARDINAL.

Volver arriba
Ver perfil del usuario Enviar mensaje privado
daalpri
Usuario Inquieto


Registrado: 28 Dic 2014
Mensajes: 105

Mensaje Publicado: Miércoles 15 Mar 2017 21:46

Título del mensaje: Programando desde 0: 38- Ejercicios de recursividad.

Responder citando

Buenas.
Tengo un problemilla en el ejercicio 1 y al intentar pasar el Debuger me sucede lo siguiente
Cuando llega a una linea en la que tiene que leer de la entrada estandar, el cursor salta a la pantallita negra, pero al seguir avanzando en el codigo, a veces al volver a leer algun dato se traba, sobre la pantalla negra sale una ventanita pequeña y tengo que cerrar el debuger y empezar de nuevo.
Esto es muy molesto para probar programas un poco largos o que tienes que introducir muchos datos, por ejemplo llenando una lista y al 5º o 6º elemento se traba y vuelta a empezar.
Tampoco se como subir aqui una captura de pantalla para que veas exactamente lo que pasa.

Otra pregunta, ¿asumimos que las dos listas son igual de largas o parte de la diferencia puede ser la longitud de las listas?

Volver arriba
Ver perfil del usuario Enviar mensaje privado
daalpri
Usuario Inquieto


Registrado: 28 Dic 2014
Mensajes: 105

Mensaje Publicado: Viernes 17 Mar 2017 01:12

Título del mensaje: Programando desde 0: 38- Ejercicios de recursividad.

Responder citando

Ejercicio1

Pues bien, aun sin poder usar el debugger pude hacerlo funcionar.

No voy a poner todo el codigo del programa que escribi para probarlo, me parece un poco largo sin necesidad. Incluye la entrada de las listas, un procedimiento que las muestra, otro que las borra para hacer nuevas pruebas sin arrancar el programa cada vez... lo dicho, un poco largo.

Como no se especificaba el tipo de lista que tenia que compararse, utilice una estructura ya usada en ejercicios anteriores
Código:

TYPE
 LNat=POINTER TO NodoLista;
 NodoLista=RECORD
  elem:CARDINAL;
  sig:LNat;
  END;


El procedimiento pedido es:
Código:

PROCEDURE SonIguales(lista1,lista2:LNat):BOOLEAN;

VAR
 aux1,aux2:LNat;
 iguales:BOOLEAN;

BEGIN

(*Primero iniciamos las variables*)
aux1:=lista1;
aux2:=lista2;

(*Empezamos a analizar las posibilidades que he encontrado para una solucion inmediata*)

(*En caso de que las dos sean listas vacias o lleguemos al final en las dos a la vez despues de rellamar x veces a la funcion, seran listas iguales*)
IF ((aux1=NIL) AND (aux2=NIL)) THEN
 iguales:=TRUE;

(*En caso de que solo una de las dos sea vacia, seran distintas*)
ELSIF ((aux1=NIL) AND (aux2<>NIL)) OR ((aux1<>NIL) AND (aux2=NIL)) THEN
 iguales:=FALSE;

(*En caso de que los elementos a comparar sean diferentes, las listas seran distintas*)
ELSIF aux1^.elem<>aux2^.elem THEN
 iguales:=FALSE;

(*En el caso de que alguna lista sea mas larga que la otra, es decir, que lleguemos
al final de una antes que al final de la otra, seran distintas*)
ELSIF ((aux1^.sig=NIL) AND (aux2^.sig<>NIL)) OR ((aux1^.sig<>NIL) AND (aux2^.sig=NIL)) THEN
 iguales:=FALSE;

(*Aqui termiarian todos los "casos base" que se me ocurren*)

(*En cualquier otro caso, que sera si los dos elementos actuales que comparamos son iguales,
rellamamos a la funcion a partir del siguiente elemento de la lista*)
ELSE
 iguales:=SonIguales(aux1^.sig,aux2^.sig);
 END;

(*Retornamos el valor que tenga la variable "iguales"*)
RETURN iguales;

END SonIguales;

He probado todos los casos que se me ocurren y funciona corectamente.
Estoy seguro de que se puede hacer de manera mucho mas sencilla.
Para ser un ejercicio calificado como FACIL me ha dado un trabajo exagerado, el tema de la recursion me esta resultando muy complicado.
Espero que cuando termine los ejercicios lo tenga suficientemente masticado para entenderlo al 100 por 100.
Reitero sin cansarme las mil gracias por tu trabajo Kyshuo y sobre todo por TU TIEMPO (que seguro no te sobra) que dedicas a nosotros.

Volver arriba
Ver perfil del usuario Enviar mensaje privado
Responder al Tema Ir a página Anterior1234Siguiente
Mostrar mensajes anteriores:   
Ir a:  
Todas las horas están en GMT + 2 Horas

Temas relacionados

Tema Autor Foros Respuestas Publicado
El foro no contiene ningún mensaje nuevo

Exportar datos desde php a excel

rafaelM1999 PHP 0 Martes 07 Ene 2020 15:31 Ver último mensaje
El foro no contiene ningún mensaje nuevo

Buenas desde el sur del sur =)

Maugarni Preséntate a la comunidad 1 Jueves 22 Ago 2019 14:09 Ver último mensaje
El foro no contiene ningún mensaje nuevo

Hola desde bcn

Dav2k6 Preséntate a la comunidad 2 Miércoles 26 Jun 2019 19:22 Ver último mensaje
El foro no contiene ningún mensaje nuevo

Existen problemas al descargar musica desde you...

SusanaP Tu PC 2 Martes 26 Mar 2019 19:22 Ver último mensaje
El foro no contiene ningún mensaje nuevo

hola!! los saludo desde argentina

mery Preséntate a la comunidad 2 Jueves 13 Dic 2018 17:28 Ver último mensaje
Panel de Control
No puede crear mensajes, No puede responder temas, No puede editar sus mensajes, No puede borrar sus mensajes, No puede votar en encuestas,