Funzioni ricorsive in JavaScript

Le funzioni ricorsive rappresentano un potente approccio nella programmazione in JavaScript e in molti altri linguaggi. Invece di risolvere un problema in modo iterativo, una funzione ricorsiva affronta il problema suddividendolo in sottoproblemi più semplici, richiamando se stessa con i sottoproblemi fino a raggiungere una soluzione.

Concetto di ricorsione

La ricorsione è una tecnica in cui una funzione si richiama direttamente o indirettamente per risolvere un problema. Quando una funzione si richiama, essa crea una catena di chiamate, in cui ogni chiamata risolve un sottoproblema più semplice. La ricorsione si basa su due elementi chiave: il caso base, che rappresenta il punto di terminazione della ricorsione, e il caso ricorsivo, che scompone il problema in sottoproblemi.

Un classico esempio di funzione ricorsiva è il calcolo del fattoriale di un numero. Il fattoriale di un numero è il prodotto di tutti i numeri interi positivi da 1 fino a quel numero.

function fattoriale(n) {
	// Caso base: il fattoriale di 0 o 1 è 1
	if (n === 0 || n === 1) {
		return 1;
	} else {
		// Caso ricorsivo: chiamata ricorsiva per calcolare il fattoriale del numero ridotto
		return n * fattoriale(n - 1);
	}
}

let numero = 5;
let risultato = fattoriale(numero);
console.log(`Il fattoriale di ${numero} è: ${risultato}`); // Stampa: Il fattoriale di 5 è: 120

Le funzioni ricorsive possono semplificare la soluzione di problemi complessi, rendendo il codice più leggibile ed elegante. Consentono anche una gestione più intuitiva di problemi suddivisi in sottoproblemi simili.

Funzioni ricorsive indirette

Le funzioni ricorsive possono essere anche indirette, ovvero una funzione richiama un'altra funzione, che a sua volta richiama la prima funzione.

function funzioneA(n) {
	if (n >= 0) {
		console.log(`Funzione A: ${n}`);
		funzioneB(n - 1);
	}
}

function funzioneB(n) {
	if (n >= 0) {
		console.log(`Funzione B: ${n}`);
		funzioneA(n - 1);
	}
}

funzioneA(3);
/* Stampa:
	 Funzione A: 3
	 Funzione B: 2
	 Funzione A: 1
	 Funzione B: 0
*/