Comunidad de diseño web y desarrollo en internet online

Problema con función recursiva

Citar            
MensajeEscrito el 01 Oct 2011 06:05 pm
Buenas:
Llevo varios dias peleandome con esta función , que en si hace lo que necesito , pero no entiendo una cosa, espero puedan ayudarme porque me está dando duros dolores de cabeza no entender algo que en sí creo que debe ser muy sencillo.

Código PHP :


function recur($dir,$id) {
    
    for ($x=0;$x<count($dir);$x++) {
        if ($dir[$x][1] == $id) {
            echo $dir[$x][2]."<BR>";
            recur($dir,$dir[$x][0]);
        }
    }
    echo 'hola';
}
$data[] = array(1,0, 'home');
$data[] = array(2,1, 'usuario1');
$data[] = array(3,1, 'usuario2');
$data[] = array(4,1, 'usuario3');
$data[] = array(5,2, 'download');
$data[] = array(6,5, 'videos');
$data[] = array(7,3, 'mp3');


La salida por pantalla es :
home
usuario1
download
videos
holaholaholausuario2
mp3
holaholausuario3
holaholahola

No entiendo 2 cosas :
Por qué se imprime 'hola' en pantalla, cuando tras el echo, no se vuelve a invocar a la función.
La variable $id toma el valor 6, al imprimir 'videos' , y cuando se imprimen los echo , cambia su valor y no entiendo por qué, puesto que como digo, ni se invoca la función y tampoco le asigno valor nuevo a la variable $id...


Espero puedan ayudarme realmente porque de verdad que en un código tan sencillo a simple vista , no me entra en cabeza esas 2 cosas y logro ver el por qué.

Un saludo y gracias

Por Shilen

3 de clabLevel



Genero:Masculino  

chrome
Citar            
MensajeEscrito el 01 Oct 2011 07:43 pm

escribió:

No entiendo 2 cosas :
Por qué se imprime 'hola' en pantalla, cuando tras el echo, no se vuelve a invocar a la función.
La variable $id toma el valor 6, al imprimir 'videos' , y cuando se imprimen los echo , cambia su valor y no entiendo por qué, puesto que como digo, ni se invoca la función y tampoco le asigno valor nuevo a la variable $id..


si no entiendes por que se imprime , debes repasar el concepto de recursividad, cuando haces las llamadas recursivas imprimira "hola" tantas veces como entradas en la función recursiva hayas hecho puesto que una vez que no se cumpla la condición del bucle o el if, se imprimirá hola, la función acabara y el código continuara ejecutándose en la linea siguiente a la ultima vez que se llamo a la función, como la función es recursiva , lo que hará sera volver al bucle y repetirlo hasta que no se cumpla la condición y luego imprimirá hola y acabara de nuevo la función. eso es la recursividad, todas las veces que entras en una función luego debes salir de ella y se ejecutara TODO su codigo, no sólo hasta la llamada recursiva

La recursividad es una tecnica compleja que requiere muchos recursos del sistema y que es util en determinadas ocasiones, pero no siempre, por ejemplo

-Tenemos un directorio con archivos y otros directorios dentro y queremos listar todos los archivos de ese arbol, Es un buen momento para usar recursividad

-Tenemos una lista enlazada y queremos ordenarla , no es bueno usar recursividad, sobre todo si para ello se crean copias de la lista. es mejor usar un bucle ya que el tamaño de la lista sera conocido.


espero haberte ayudado, un saludo.

Por bray

65 de clabLevel



 

firefox
Citar            
MensajeEscrito el 01 Oct 2011 08:53 pm
Hola!
Muchisimas gracias por contestar . No sabía o mejor dicho no recordaba que una función recursiva al no cumplirse la condición en este caso, se vuelve a ejecutar con los 'anteriores' valores pasados hasta que no se cumpla por completo.

Por Shilen

3 de clabLevel



Genero:Masculino  

chrome
Citar            
MensajeEscrito el 02 Oct 2011 09:47 am
bueno , no es que se "vuelva" a ejecutar exactamente, es que se ejecuta la llamada anterior con los valores anteriores como cualquier otra funcion en php las variables declaradas dentro de ella desaparecen cuando la funcion se termina de ejecutar , la recursividad es complicada y a veces los errores son dificiles de ver

suerte

Por bray

65 de clabLevel



 

firefox

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.