La funzione ricorsiva è una funzione che chiama da sola
Consente ai programmatori di scrivere programmi efficienti utilizzando una quantità minima di codice .
Lo svantaggio è che possono causare loop infiniti e altri risultati imprevisti se non scritti correttamente .
Spiegherò sia la funzione ricorsiva semplice che la funzione ricorsiva di coda
Per scrivere una funzione ricorsiva semplice
- Il primo punto da considerare è quando dovresti decidere di uscire dal ciclo che è il ciclo if
- Il secondo è quale processo fare se siamo la nostra stessa funzione
Dall'esempio fornito:
public static int fact(int n){
if(n <=1)
return 1;
else
return n * fact(n-1);
}
Dall'esempio sopra
if(n <=1)
return 1;
È il fattore decisivo quando uscire dal ciclo
else
return n * fact(n-1);
È l'effettiva elaborazione da eseguire
Consentitemi di interrompere il compito uno per uno per una facile comprensione.
Vediamo cosa succede internamente se corro fact(4)
- Sostituendo n = 4
public static int fact(4){
if(4 <=1)
return 1;
else
return 4 * fact(4-1);
}
If
il ciclo fallisce quindi va in else
ciclo così ritorna4 * fact(3)
Nella memoria dello stack, abbiamo 4 * fact(3)
Sostituendo n = 3
public static int fact(3){
if(3 <=1)
return 1;
else
return 3 * fact(3-1);
}
If
il ciclo fallisce quindi va a else
ciclo
quindi ritorna 3 * fact(2)
Ricorda che abbiamo chiamato `` 4 * fact (3) ``
L'output per fact(3) = 3 * fact(2)
Finora lo stack ha 4 * fact(3) = 4 * 3 * fact(2)
Nella memoria dello stack, abbiamo 4 * 3 * fact(2)
Sostituendo n = 2
public static int fact(2){
if(2 <=1)
return 1;
else
return 2 * fact(2-1);
}
If
il ciclo fallisce quindi va in else
ciclo
quindi ritorna 2 * fact(1)
Ricorda che abbiamo chiamato 4 * 3 * fact(2)
L'output per fact(2) = 2 * fact(1)
Finora lo stack ha 4 * 3 * fact(2) = 4 * 3 * 2 * fact(1)
Nella memoria dello stack, abbiamo 4 * 3 * 2 * fact(1)
Sostituendo n = 1
public static int fact(1){
if(1 <=1)
return 1;
else
return 1 * fact(1-1);
}
If
loop è vero
quindi ritorna 1
Ricorda che abbiamo chiamato 4 * 3 * 2 * fact(1)
L'output per fact(1) = 1
Finora lo stack ha 4 * 3 * 2 * fact(1) = 4 * 3 * 2 * 1
Infine, il risultato di fatto (4) = 4 * 3 * 2 * 1 = 24
La ricorsione della coda sarebbe
public static int fact(x, running_total=1) {
if (x==1) {
return running_total;
} else {
return fact(x-1, running_total*x);
}
}
- Sostituendo n = 4
public static int fact(4, running_total=1) {
if (x==1) {
return running_total;
} else {
return fact(4-1, running_total*4);
}
}
If
il ciclo fallisce quindi va in else
ciclo così ritornafact(3, 4)
Nella memoria dello stack, abbiamo fact(3, 4)
Sostituendo n = 3
public static int fact(3, running_total=4) {
if (x==1) {
return running_total;
} else {
return fact(3-1, 4*3);
}
}
If
il ciclo fallisce quindi va in else
ciclo
quindi ritorna fact(2, 12)
Nella memoria dello stack, abbiamo fact(2, 12)
Sostituendo n = 2
public static int fact(2, running_total=12) {
if (x==1) {
return running_total;
} else {
return fact(2-1, 12*2);
}
}
If
il ciclo fallisce quindi va in else
ciclo
quindi ritorna fact(1, 24)
Nella memoria dello stack, abbiamo fact(1, 24)
Sostituendo n = 1
public static int fact(1, running_total=24) {
if (x==1) {
return running_total;
} else {
return fact(1-1, 24*1);
}
}
If
loop è vero
quindi ritorna running_total
L'output per running_total = 24
Infine, il risultato di fatto (4,1) = 24