Contenuti del Corso
Java Avanzato
Java Avanzato
Ricorsione
Come rompere facilmente il tuo codice?
Perché questo può rompere il codice? Perché può portare a una ricorsione infinita, che consumerà memoria senza fine e ridurrà le prestazioni del dispositivo. Allora perché abbiamo bisogno della ricorsione? In alcuni casi, la ricorsione può essere utile, ma dovrebbe essere utilizzata con cautela. Ad esempio, la ricorsione può sostituire un ciclo while. Vediamo un esempio di utilizzo della ricorsione per calcolare la somma di tutti i numeri fino a un numero passato come parametro:
Main.java
package com.example; public class Main { // main method to run the application public static void main(String[] args) { // do not modify the code below System.out.println(calculateSum(5)); } // method to calculate the sum of numbers from 1 to num using recursion static int calculateSum(int num) { // if num is greater than 0, recursively calculate the sum if (num > 0) { num = num + calculateSum(num - 1); } else { return 0; } return num; } }
Il metodo calculateSum()
richiama sé stesso con valori ridotti. È presente anche un punto di uscita da questa ricorsione quando la variabile num
diventa zero. Questo metodo calcola la somma di tutti i numeri da 1 fino al parametro, nel nostro caso 5
. Osserviamo il diagramma di flusso che mostra come funziona la ricorsione utilizzando questo metodo come esempio:
L'esempio sopra dimostra come il metodo richiami sé stesso con valori ridotti e, quando raggiunge zero, risale sommando i valori. Si può anche osservare come venga eseguito il corpo del blocco if
, dove si aggiunge num
al risultato della chiamata del metodo con un valore ridotto. I valori intermedi dopo ogni chiamata del metodo sono indicati vicino alle frecce.
Possiamo evitare di usare la ricorsione?
La ricorsione può anche essere sostituita con un ciclo normale. Vediamo un esempio in cui prima utilizziamo un metodo ricorsivo e poi un ciclo for
per eseguire la stessa operazione:
Main.java
package com.example; public class Main { // main method to run the application public static void main(String[] args) { // do not modify the code below int num = 5; // printing the result of the recursive sum calculation System.out.println("Result using recursion: " + calculateSum(num)); int result = 0; // calculating the sum using a for-loop for (int i = 1; i <= num; i++) { result = result + i; } // printing the result of the sum calculation using the for-loop System.out.println("Result using for-loop: " + result); } // method to calculate the sum of numbers from 1 to num using recursion static int calculateSum(int num) { // if num is greater than 0, recursively calculate the sum if (num > 0) { num = num + calculateSum(num - 1); } else { return 0; } return num; } }
Qui possiamo vedere come sostituiamo il nostro metodo ricorsivo con un normale ciclo for
, utilizzando la variabile i
per incrementare il nostro result
di i
ogni volta fino a raggiungere il numero specificato num
, che è il parametro del metodo.
Conclusione
In conclusione, i metodi ricorsivi possono essere utili ma anche rischiosi. La ricorsione può spesso essere sostituita da cicli, e sebbene possa semplificare alcuni compiti, può anche causare problemi se non utilizzata con attenzione. Se si sceglie di utilizzare la ricorsione, anche con esperienza, è importante procedere con cautela.
1. Che cos'è la ricorsione in Java?
2. Qual è meglio utilizzare, la ricorsione o un ciclo regolare?
Grazie per i tuoi commenti!