funzione ricorsiva che non va

lo script seguente dovrebbe fare le seguenti cose:

- generare un numero random e sottrarlo all numero 30

- valutare se il valore assoluto della sottrazione e maggiore di 40

- se il risultato è maggiore di 39 rilanciare il processo di generazione del numero random e rifare la sottrazione (ricorsivamente)

- inoltre dovrebbe contare e istanzare in $numero_tentativi il numero di volte che il processo deve essere reiterato per soddisfare la condizione "abs($diff) < 40"

- restituire sia il valore del numero random che rispetta la condizione "abs($diff) < 40" che il numero di iterazioni.

A volte la funzione non restituisce niente mentre restituisce sempre 1 come numero di iterazioni. Come mai?

<?php

$y = 30;

function val_distanze($y_old){

static $numero_tentativi = 0;

$numero_tentativi++;

$new_random = rand(0, 576);

$diff = $y_old - $new_random;

if(abs($diff) < 40){

val_distanze($y_old);

}

else {

return $new_random . " / " . $numero_tentativi;

}

}

echo val_distanze($y);

?>

inviato 10 anni fa
Enea Zenni
X 0 X

perchè ogni volta che la funzione viene richiamata azzeri $numero_tentativi e poi incrementi, secondo me il numero di tentativi lo devi passare alla funzione come parametro.

Quando la chiami la prima volta ovviamente a 0, quando richiama se stessa passerà il valore incrementato.

risposto 10 anni fa
LonelyWolf
X 0 X

si ma la cosa + strana (al di là del fatto che azzera il contatore) è che lo scirpt dovrebbe sempre satmpare alme+ no $new_random. invece a volta la pagina è tutta bianca

risposto 10 anni fa
Enea Zenni
X 0 X

Ho fatto un po' di debug sul codice, inutilmente perchè poi mi sono reso conto che è normale il fatto che le iterazioni siano nella maggior parte dei casi 1 (raramente 2 o 3, fatto molti test) ed il motivo e semplice:

i numeri inferiori a 40 sono pochissimi rispetto al totale per cui le iterazioni sono sempre minime, con questo calcolo praticamente solo i numeri da 0 a 69 fanno eseguire una successiva iterazione, mentre i numeri da 70 a 560 no. In questo secondo caso il valore assoluto è sempre maggiore o uguale a 40 (30-70=-40 abs->40 fine funzione).

Non ho capito come mai ci fossero le pagine bianche a volte, solo identando correttamente il codice sono sparite (nei miei test).

Ecco il codice, non sono stato a pulirlo per bene perchè tra 5 minuti stacco, messo così visualizza tutti i passaggi, puoi pulirlo tu e sistemare la restituzione del valore:

<?php

function val_distanze($y_old,$numero_tentativi){
  echo "entro funzione<br />";
  $numero_tentativi++;
  $new_random = rand(0, 576);
  $diff = $y_old - $new_random;
  if(abs($diff) < 40){
    echo "(".abs($diff).")$diff/$new_random/$numero_tentativi<br />";
    val_distanze($y_old,$numero_tentativi);
  }
  else {
    echo "(".abs($diff).")$diff/$new_random/$numero_tentativi<br />Fine funzione<br />";
    return 0;
  }
}

echo "(absdiff)diff/random/tentativi<br />";
$y=30;
val_distanze($y,0);

?>
risposto 10 anni fa
LonelyWolf
X 0 X

sai qual'è il problema? che quando richiamo la funzione ricorsivamente mi sono dimenticato di scrivere return davanti al nome della funzione stessa. ti risulta ???

risposto 10 anni fa
Enea Zenni
X 0 X
sai qual'è il problema? che quando richiamo la funzione ricorsivamente mi sono dimenticato di scrivere return davanti al nome della funzione stessa. ti risulta ???

Non capisco cosa vuoi dire, cmq si manca un return dopo di if... else

risposto 10 anni fa
LonelyWolf
X 0 X

e mi sa che era la mancanza del return a dare quegli strani risultati! come ti dicevo a volte non satmpava un bel niente (pagina bianca). da quando  ho aggiunto il return tutto va bene: sempre!

capito? mi domando come mai non desse errore e come mai a volte il tutto funzionasse. Insomma uno script o va o non va di solito. sono rare ste eccezzioni in cui si ha un funzionamento anomalo. boh?

ciao

risposto 10 anni fa
Enea Zenni
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda