Foros del Web » Programando para Internet » PHP »

Duda con recursividad en PHP

Estas en el tema de Duda con recursividad en PHP en el foro de PHP en Foros del Web. Tengo una duda respecto a la recursividad en php les dejo un ejemplo: Código PHP: <?php function  factorial ( $n ) {     if( $n == ...
  #1 (permalink)  
Antiguo 06/04/2009, 15:40
Avatar de Farookh_Bulsara  
Fecha de Ingreso: mayo-2004
Mensajes: 1.185
Antigüedad: 15 años, 6 meses
Puntos: 2
Duda con recursividad en PHP

Tengo una duda respecto a la recursividad en php
les dejo un ejemplo:
Código PHP:
<?php
function factorial($n)
{
    if(
$n==0)
    {
    echo 
"paro cuando valor vale $n"."<br>";
    return 
1;
    }
    else
    {
    
$valor $n*factorial($n-1);
    echo 
"elvalor devuelto por la llamada recursiva cuendo n vale $n es: $valor <BR>";
    return 
$valor;
    }
}
$valor factorial(7);
echo 
"el factorial de 7 es $valor<br>";
?>
Es el tipo ejemplo de recursividad
Mi pregunta es que pasa si el valor "n" es un objeto de una clase que yo hice?
Se almacenarian sus distintos estados de igual forma?
Osea el valor "n" va en esta secuencia:

7,6,5,4,3,2,1,0,1,2,3,4,5,6,7
Osea la primera vez q lo llamo vale 7, luego la sgunda vez vale 6 y asi sucesivamente,entonces eso quiere decir que los numero 7,6,5,4,3,2,1 se almacenan en memoria ,porq sino no supiera como regresar despues de los return
Se puede usarl el valor "n" como un objeto? de se asi, se almacenarian los distintos valores?
Mi problema es distinto,no es el del factorial,solo lo puse como ejemplo
__________________
"Todas las cosas deben mostrarse primero con mascaras tetricas y terrorificas para que puedan inscribirse a si mismas en el corazon de la humanidad"
  #2 (permalink)  
Antiguo 06/04/2009, 15:50
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 13 años, 6 meses
Puntos: 2135
Respuesta: Duda con recursividad en PHP

No, lo que PHP va guardando es el resultado de la asignación. PHP como la mayoría de los lenguajes se ejecuta de arriba a abajo, y de izquierda a derecha, por lo que va almacenando en memoria el resultado de las llamadas.

No es posible "acceder" a esa información ya que esta de forma temporal esperando respuesta del return.

Tu puedes hacer cualquier función recursiva y pasar el parámetro que quieras, ya sea un número como en este caso o un objeto, el chiste es controlar que tu recursión no sea infinita ya que entonces creas un loop infinito.

Saludos.
  #3 (permalink)  
Antiguo 06/04/2009, 15:54
Avatar de Farookh_Bulsara  
Fecha de Ingreso: mayo-2004
Mensajes: 1.185
Antigüedad: 15 años, 6 meses
Puntos: 2
Respuesta: Duda con recursividad en PHP

yo hice la prueba depurando este codigo ya funciona como dije
osea
el valor n primero vale 7 ,luego va reduciendo de uno en uno(porq nosotros lo reducimos de uno en uno) pero cuando llega a la condicion de return(n==0) entonces el valor de n se incrementa segun el orden de las llamadas osea va asi:
0,1,2,3,4,5,6,7
Eso quiere decir q los distintos valores q va teniendo "n" se almacenan, sucede lo mismo con los objetos?,osea suponiendo q "n" sea un objeto
__________________
"Todas las cosas deben mostrarse primero con mascaras tetricas y terrorificas para que puedan inscribirse a si mismas en el corazon de la humanidad"
  #4 (permalink)  
Antiguo 06/04/2009, 16:14
Avatar de Avatar810  
Fecha de Ingreso: agosto-2007
Ubicación: Por rumbos Regios
Mensajes: 485
Antigüedad: 12 años, 3 meses
Puntos: 23
Respuesta: Duda con recursividad en PHP

No habia logrado entender tu punto, pero ya hice la ejecucion de tu "aplicacion" y logre ver lo que dices.
En efecto la respuesta se muestra en forma incremental dabido a la logica de la aplicacion
Los resultados:

factorial(7)
{
factorial(7-1)
{
factorial(6-1)
{
factorial(5-1)
{
factorial(4-1)
{
factorial(3-1)
{
factorial(2-1)
{
factorial(1-1)
{
}
imprime resultado de 0
}
imprime resultado de 1
}
imprime resultado de 2
}
imprime resultado de 3
}
imprime resultado de 4
}
imprime resultado de 5
}
imprime resultado de 6
}
imprime resultado de 7

Segun la logica imprimes inmediatamente termina la funcion.
Debido a la iteracion la funcion mas interna es la que termina primero pues las superiores tienen dependencia de la interna.
__________________
Una demo siempre funcionará correctamente hasta que toque algo tu (hasta ahora) cliente.
Avatar810
  #5 (permalink)  
Antiguo 06/04/2009, 16:25
Avatar de Farookh_Bulsara  
Fecha de Ingreso: mayo-2004
Mensajes: 1.185
Antigüedad: 15 años, 6 meses
Puntos: 2
Respuesta: Duda con recursividad en PHP

claro lo q dices es asi,eso es obvio
pero porq no probas depurando el script
veras q la variable n sigue los sigueintes valores:
7,6,5,4,3,2,1,0,1,2,3,4,5,6,7
Como en cada llamada "n" solo puede tener un valor,eso quiere decir q los restantes valores se almacenan, pasa lo mismo con los objetos,osea si "n" fuera un objeto
__________________
"Todas las cosas deben mostrarse primero con mascaras tetricas y terrorificas para que puedan inscribirse a si mismas en el corazon de la humanidad"
  #6 (permalink)  
Antiguo 06/04/2009, 16:31
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 13 años, 6 meses
Puntos: 2135
Respuesta: Duda con recursividad en PHP

Con objetos es un poco más complicado, esto es porque dependiendo de tu versión de PHP, puedes pasar un objeto por valor o por referencia, cuando tu haces un return de una variable normal pasas el valor de tu variable, y en un objeto puedes pasar la referencia.

Todo depende de lo que necesites hacer ya que por ejemplo usando un objeto:
Código php:
Ver original
  1. <?php
  2. function factorial($objeto) {
  3.     if ($objeto->factorial ==0) {
  4.         $objeto->factorial = 1;
  5.         return;
  6.     } else {
  7.         $aux = new StdClass();
  8.         $aux->factorial = $objeto->factorial - 1;
  9.         factorial($aux);
  10.         $objeto->factorial = $objeto->factorial * $aux->factorial;
  11.         return;
  12.     }
  13. }
  14. $obj = new StdClass();
  15. $obj->factorial = 7;
  16. factorial($obj);
  17. printf( "el factorial de 7 es %s<br>", $obj->factorial );
  18. ?>

No, aunque depures, $n, siempre trae el valor que le envia la función, por eso es una variable local, esta se va guardando y va almacenando, ve el ejemplo que te dejo Avatar810, es muy claro, conforme se va anidando la función va creando valores, pero estos son locales a la función, no se comparte ni es la misma variable.

Saludos.
  #7 (permalink)  
Antiguo 06/04/2009, 16:58
Avatar de Avatar810  
Fecha de Ingreso: agosto-2007
Ubicación: Por rumbos Regios
Mensajes: 485
Antigüedad: 12 años, 3 meses
Puntos: 23
Respuesta: Duda con recursividad en PHP

No es precisamente que decremente y despues incremente mas bien es el valor que tiene la funcion en la linea de tiempo que manejas

supongamos que cada renglon es una llamada a la funcion
En el primer renglon tiene 7
al iterar creas una nueva linea donde su valor es 6 y asi sucesivamente
Cuando la funcion termina y regresa el valor / control a donde fue invocada continua con el valor para esa linea de tiempo. pero el valor propiamente nunca cambio pues son valiables independientes

77---------------------------------------77
---66---------------------------------66---
------55---------------------------55------
---------44---------------------44---------
------------33---------------33------------
---------------22---------22---------------
------------------11---11------------------
---------------------00---------------------

Cosa que puede ser muy diferente con los objetos asi como lo dice Gator V, pues ya que se puede estar apuntando al objeto directamente puedes estar cambiando el valor en tiempo real sin importar que tan profundo te encuentres es una iteracion
Por tratar de ejemplificarlo con algo mas comun, es cunado afectas el valor de una variable globla desde dentro de una funcion. esto pasa si envias el objeto.
__________________
Una demo siempre funcionará correctamente hasta que toque algo tu (hasta ahora) cliente.
Avatar810
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 02:33.