return di una funzione ricorsiva

  • Creatore Discussione Creatore Discussione criric
  • Data di inizio Data di inizio

criric

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
21 Ago 2010
5.606
54
48
TN
Ciao a tutti,
ho un problema con il return di una funzione ricorsiva che sto scrivendo
per recuperare degli id particolari dal database.

Ho ridotto al minimo essenziale per capirne la logica ma proprio non ci arrivo.

Il return è sempre null.

Ho risolto usando la SESSION ma mi sto ancora chiedendo il perchè.

Qualcuno ha una soluzione anche alternativa alla mia? in modo da non usare le sessioni

PHP:
function ricorsiva($numero) {
// se il risultato è quello che cerco esco
    if ($numero == 5) {
        $_SESSION['numero'] = $numero;
        return $numero;
// altrimenti richiamo di nuovo la funzione cambiando il parametro
    } else {
        ricorsiva($numero + 1);
    }
}

// richiamo la funzione 
$risultato = ricorsiva(1);

// $risultato è null
var_dump($risultato);
// in session invece trovo il valore
var_dump($_SESSION['numero']);


grazie.
 
Vi posto anche lo script originale nel caso vi venga in mente un altra soluzione

Ho una tabella livelli che ha 2 campi:
idutentepadre
idutente

Ogni utente può essere sia padre che figlio

Ricevuto un id devo risalire al capostipite della tabella

Questa era la mia idea:

PHP:
$conn = mysql_connect('host', 'user', 'pass', 'database');
$db = mysql_select_db('database', $conn);

function capostipite($conn, $idfiglio) {
// inizializzo il capostipite
    $capostipite = $idfiglio;
// query nella tabella livelli
    $query = "SELECT idutentepadre FROM livelli
                                   WHERE idutente = $idfiglio";
//  eseguo la query
    $result = mysql_query($query);
// se non ho risultati ho trovato il capostipite ed esco
    if ($result && mysql_num_rows($result) == 0) {
        //la session funziona ma il return no
        $_SESSION['capostipite'] = $capostipite;
        return $capostipite;
// altrimenti richiamo la funzione passandogli l'id padre recuperato
    } else {
        $padre = mysql_result($result, 0, 'idutentepadre');
        capostipite($conn, $padre);
    }
}

//richiamo la funzione passandogli un idfiglio
$capostipite = capostipite($conn, 3022);
//la variabile capostipite è null
var_dump($capostipite);
// nalla session invece ho l'id che cerco
var_dump($_SESSION['capostipite']);
 
ciao
potresti risolverla semplicemente così

PHP:
<?php
function no_ricorsiva($numero) {
	while($numero <5){
		$numero++;
	}
	return $numero;
}

// richiamo la funzione
var_dump(no_ricorsiva(1));
?>
 
Ottima suluzione!

grazie!

Ci ho messo un po ad adattarla ma ora è perfetta.

PHP:
function capostipite($conn, $idfiglio) {

    $esco = 0;
    while ($esco = 1) {
        $query = "SELECT idutentepadre FROM livelli
                                   WHERE idutente = $idfiglio";

        $result = mysql_query($query);

        $idfiglio = mysql_result($result, 0, 'idutentepadre');

        if (mysql_num_rows($result) == 0) {
            $esco = 1;
        }
     return $idfiglio;
    }
    
}
 
grande Ale! non mi sarei mai rassegnato
 

Discussioni simili