Código PHP:
Function Test () {
static $count = 0;
$count++;
echo $count;
if ($count < 9) {
Test ();
}
echo "Paso por aca";
$count--;
}
desde ya un abrazo.
| |||
Consulta Basica sobre Recursividad. Hola chicos, tengo el siguiene codigo Recursivo, en el cual hay una parte que no entiendo. Código PHP: desde ya un abrazo. |
| |||
Respuesta: Consulta Basica sobre Recursividad. El "problema" (de hecho no lo es, sino mas bien un error de programación tuyo) es que el ejecutar (recursivamente o no) la función Test() no termina la ejecución de la función. Ejemplo: Yo tengo una función que ejecuta a, b y c. b es un proceso que llama nuevamente a la función hasta que se ha ejecutado 3 veces. Tienes entonecs la siguiente estructura de procesos a realizar:
Código:
La "solución" (como ya te dije, no es un problema) es utilizar el keyword return en cada llamado recursivo a la función, lo que hará que su ejecución termine. El árbol de procesos quedaría así: (b ahora es un proceso que llama a la función y termina su ejecución, impidiendo que se ejecute c)Funcion: a b // Llama recursivamente a la función c Llamado a la función: a b // Llamando nuevamente a la función - 1 a b // Llamando nuevamente a la función - 2 a b // Llamando nuevamente a la función - 3 a b // 4 - No se ejecuta este proceso, ya no llama a la función. Ahora falta ejecutar el proceso c, que se fue acumulando c // Proceso c del 3er llamado a la función c // Proceso c del 2do llamado a la función c // Proceso c del 1er llamado a la función c // Proceso c del llamado original a la función
Código:
Espero me hayas entendido, aplica el mismo criterio a tu función, usando return antes de Test() para finalizar así la ejecución actualFuncion: a b // Llama recursivamente a la función y termina la ejecución actual usando un return c Llamado a la función: a b // Llamando nuevamente a la función terminando esta ejecución - 1 a b // Llamando nuevamente a la función terminando esta ejecución - 2 a b // Llamando nuevamente a la función terminando esta ejecución - 3 a b // 4 - No se ejecuta, ya no llama a la función ni termina la ejecución actual c // Proceso c del 3er llamado a la función Saludos, |
| |||
Respuesta: Consulta Basica sobre Recursividad. Hola, gracias por responder, en si, no era un problema de programacion mia, solo es que no entendia esa funcion de recursividad que encontré en un manual de PHP, y sabia que en algun lugar tenia que poner el return, pero no sabia donde. Les Agradesco las explicaciones, me fueron muy util para poder entenderlo. Desde Ya, muchas gracias por todo. Un abrazo. |
| ||||
Respuesta: Consulta Basica sobre Recursividad. que no es por el count++ y count-- ??? (así nunca avanzaría) y yo creo, que si como programador no te fijas.... no es culpa de PHP sino de uno mismo, suerte!
__________________ Y U NO RTFM? щ(ºдºщ) No atiendo por MP nada que no sea personal. |
| |||
Respuesta: Consulta Basica sobre Recursividad. @pateketrueke, $count-- no tiene utilidad práctica en ese código, pues esa porción del código se efectúa terminada la recursividad, cuando la función ya no hará nada más. Por lo tanto, sólo tiene influencia en el valor final de $count, mas no en la salida de impresión. En el árbol de procesos que puse más arriba es la porción c del código, la cual se ejecuta todo en conjunto al final de todos los demás procesos. Prueba:
Código php:
Ver original Imprime
Código:
Verás que aunque en la primera se hace el count-- y en la segunda no, se imprimen el mismo número de líneas, variando sólo el valor de $count con que termina cada ejecución. ¿Qué repercusión tiene esto? Que si no se realiza el $count-- la función sólo responderá bien en su primera ejecución, mas no entrará en recursividad en una segunda ejecución, pues el puntero $count no fue reseteado.Primera ejecución de Test1() Se ejecuta la función recursivamente 9 veces, y el último bloque se imprime al final resetando $count1 9 veces hasta su valor original $count1: 1 $count1: 2 $count1: 3 $count1: 4 $count1: 5 $count1: 6 $count1: 7 $count1: 8 $count1: 9 Paso por aca y $count1 vale 8 Paso por aca y $count1 vale 7 Paso por aca y $count1 vale 6 Paso por aca y $count1 vale 5 Paso por aca y $count1 vale 4 Paso por aca y $count1 vale 3 Paso por aca y $count1 vale 2 Paso por aca y $count1 vale 1 Paso por aca y $count1 vale 0 Segunda ejecución de Test1() Como $count1 fue reseteada, la función se ejecuta de nuevo exactamente igual que en el primer caso. Vemos que siempre $count1 regresa a su valor original $count1: 1 $count1: 2 $count1: 3 $count1: 4 $count1: 5 $count1: 6 $count1: 7 $count1: 8 $count1: 9 Paso por aca y $count1 vale 8 Paso por aca y $count1 vale 7 Paso por aca y $count1 vale 6 Paso por aca y $count1 vale 5 Paso por aca y $count1 vale 4 Paso por aca y $count1 vale 3 Paso por aca y $count1 vale 2 Paso por aca y $count1 vale 1 Paso por aca y $count1 vale 0 ================================================================================================== Primera ejecución de Test2() A diferencia de Test1() $count2 no es reseteada, por lo que su valor final es 9 $count2: 1 $count2: 2 $count2: 3 $count2: 4 $count2: 5 $count2: 6 $count2: 7 $count2: 8 $count2: 9 Paso por aca y $count2 vale 9 Paso por aca y $count2 vale 9 Paso por aca y $count2 vale 9 Paso por aca y $count2 vale 9 Paso por aca y $count2 vale 9 Paso por aca y $count2 vale 9 Paso por aca y $count2 vale 9 Paso por aca y $count2 vale 9 Paso por aca y $count2 vale 9 Segunda ejecución de Test2() El valor inicial de $count1 es 9; antes de efecutar la recursividad, se le agrega 1, por lo que no pasa el condicional para ejecutarse recursivamente, por eso la función sólo se ejecuta una vez $count2: 10 Paso por aca y $count2 vale 10 Tercera ejecución de Test2() Igual que en el caso anterior $count2: 11 Paso por aca y $count2 vale 11 Cuarta ejecución de Test2() Igual que en el caso anterior $count2: 12 Paso por aca y $count2 vale 12 ================================================================================================== Primera ejecución de Test3() En Test3() aplicamos el mismo algoritmo que en Test1(), con la diferencia que Test3() ejecuta la recursividad terminando la ejecución actual $count3: 1 $count3: 2 $count3: 3 $count3: 4 $count3: 5 $count3: 6 $count3: 7 $count3: 8 $count3: 9 Paso por aca y $count3 vale 8 Segunda ejecución de Test3() Como en la ejecución anterior la recursividad terminaba con la ejecución de la función, el último bloque sólo se ejecutará si la condición establecida no se cumple y la función no entra en recursividad. Por lo tanto, el puntero no reseteado no cumple la condición y la función no entra a la recursividad $count3: 9 Paso por aca y $count3 vale 8 Tercera ejecución de Test3() Igual que en el caso anterior $count3: 9 Paso por aca y $count3 vale 8 Saludos, |
| ||||
Respuesta: Consulta Basica sobre Recursividad. @okram, simplemente genial!! (yo andaba supongo) gracias...
__________________ Y U NO RTFM? щ(ºдºщ) No atiendo por MP nada que no sea personal. |
| |||
Respuesta: Consulta Basica sobre Recursividad. Tengo el siguiente problema, a ver si temrmino de entender. por ejemplo hago: Código PHP: Código PHP: |
| ||||
Respuesta: Consulta Basica sobre Recursividad. es que te falta devolver también funcionrecursiva(); no mas, suerte! y de hecho devuelve un 9 ya que incrementas antes de devolver...
__________________ Y U NO RTFM? щ(ºдºщ) No atiendo por MP nada que no sea personal. |
| |||
Respuesta: Consulta Basica sobre Recursividad. Cita: Gracias por la repsuesta, pero no entendi, , que linea tendria que modificar para devolver funcionrecursiva();? es que te falta devolver también funcionrecursiva(); no mas, suerte! y de hecho devuelve un 9 ya que incrementas antes de devolver... |