[ Foro de C++ ]

Ejemplo nº83

18-Jun-2013 23:32
David Garcia
3 Respuestas

Hola, he estado repasando una y otra vez este ejemplo ( Ejemplo 83 de la revisión 0.90, pagina 148), y lo entiendo casi al completo perfectamente, la única parte que no entiendo es la de la función escribir. Veo que funciona, pero no se porque. Le adjunto el tramo que no entiendo:

 
void Escribir(struct arbol *punt)
{
if (punt) /* Si no hemos llegado a una hoja */
{
Escribir(punt->hijoIzq); /* Mira la izqda recursivamente */
printf("%d ",punt->dato); /* Escribe el dato del nodo */
Escribir(punt->hijoDer); /* Y luego mira por la derecha */
};
};
 


La función comienza introduciendo la dirección donde empieza  nuestro árbol, y empieza a entrar en punt->hijoIzq hasta llegar al ultimo, para así imprimir en pantalla el de menor valor y empezar desde ahí. Hasta aquí todo bien, pero lo que no entiendo es porque al llegar al primer valor NULL no se sale de la función y termina (ya que no cumpliría el bucle IF), sino que vuelve a comenzar y imprime el primer valor.

Espero su respuesta ya que me he quedado un poco "atrancado" con esto, muchas gracias y como siempre le digo, MUY BUEN TRABAJO.


21-Jun-2013 13:16
Invitado (ANONIMO)

Ni idea, yo tambien tengo esa duda


21-Jun-2013 23:52
Nacho Cabanes (+32)

Cuando llega a un valor NULL se sale de la llamada actual de la función, pero cuando se trata de funciones recursivas, puede existir otra serie de llamadas anteriores que aún no se han resuelto por falta de datos.

Piensa por un momento cómo se calcula una función recursiva de las "típicas", como un factorial, y verás que hay una serie de pasos intermedios que se quedan "congelados" hasta que reciben  los datos que necesitaban.

Lo mismo ocurre en este caso: se busca por la izquierda hasta encontrar el menor de todos, y luego se van procesando las llamadas que quedaban pendientes, y que correspondían a valores "pequeños pero no mínimos".


22-Jun-2013 12:47
David Garcia

AJA, osea que el mismo c es capaz de seguir por donde iba aunque se haya salido de la función...pensaba que eso solo lo hacia en el main.
Gracias maestro






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