3 minutes
Esercizi ricorsione
Per completezza, si rimanda al primo post del sito per ulteriori informazioni.
Si ricorda che dello stesso esercizio possono esistere più varianti.
Fattoriale
Si scriva una funzione fattoriale(n) che, dato come argomento un intero positivo, restituisca il suo fattoriale. Esempi:
fattoriale(1) → 1
fattoriale(5) → 120
fattoriale(10) → 3628800
function fattoriale(n) {
if (n<=1)
return 1;
return n * fattoriale(n-1);
}
function fattoriale_tailrec(n,acc = 1) {
if (n <= 1)
return acc;
return fattoriale_tailrec(n-1,acc * n);
}
// fattoriale_tailrec(10) → 3628800
Numeri triangolari
Realizzare una funzione ricorsiva che, dato un intero >=0 n, calcoli il valore dell’ennesimo numero triangolare. Esempi:
triangle(3) → 6
triangle(6) → 21
function triangle(n) {
if (n<=1)
return 1;
return n + triangle(n-1);
}
function triangleCoda(n,s = 0) {
if (n<1) {
return s;
}
else {
s += n + (triangleCoda(n-1,s));
}
return s;
}
Cifre
Si scriva una funzione ricorsiva cifre(n) che, dato come argomento un intero positivo, mostri a video le sue cifre, una per riga. Esempi:
cifre(2563) → 2 5 6 3
cifre(5) → 5
cifre(98763) → 9 8 7 6 3
function cifre(n) {
if (n <= 0)
return;
cifre(Math.floor(n/10));
console.log(n%10);
}
Cifre in ordine inverso
Si scriva una funzione ricorsiva cifreInv(n) che, dato come argomento un intero positivo, mostri a video le sue cifre, in ordine inverso, una per riga. Esempi:
cifreInv(2563) → 3 6 5 2
cifreInv(5) → 5
cifreInv(98763) → 3 6 7 8 9
function cifreInv(n) {
if (n <= 0)
return;
console.log(n%10);
cifreInv(Math.floor(n/10));
}
Somma cifre
Si scriva una funzione ricorsiva sommaCifre(n) che, dato come argomento un intero positivo, restituisca la somma delle sue cifre. Esempi:
sommaCifre(2563) → 16
sommaCifre(5) → 5
sommaCifre(98763) → 33
function sommaCifre(n) {
if (n <= 0)
return 0;
return (n % 10) + sommaCifre(Math.floor(n/10));
}
Somma array
Si scriva una funzione ricorsiva sommaArray(a) che, dato come argomento un array di interi, restituisca la somma dei suoi elementi. Esempi:
sommaArray([3,6,1,3]) → 13
sommaArray([46,-1,-45, 0,2 -4, 3,-1]) → 0
function sommaArray(a) {
if (a.length == 0)
return 0;
return a.pop() + sommaArray(a);
}
Sequenza crescente
Realizzare una funzione ricorsiva che controlli che un array di numeri interi positivi dato in input sia ordinato in ordine strettamente crescente. Esempi:
ordinato([1,5,9,12,56,57,29]) → true
ordinato([7]) → true
ordinato([3,7,5,8,9,10]) → false
function ordinato(a) {
if (a.length == 0 || a.length == 1)
return true;
return (a[0] < a[1]) && ordinato(a.slice(1));
}
Fibonacci
Realizzare una funzione ricorsiva fib che, dato un intero positivo n, restituisca l’ennesimo numero nella serie di Fibonacci: F(0)=0; F(1)=1; F(n)=F(n-1)+F(n-2), n>=2 Esempi:
fib(5) → 5
fib(7) → 13
function fib(n) {
if (n == 1)
return 1;
if (n == 2)
return 1;
return fib(n-1) + fib(n-2);
}
function fib_tailrec(n)
{
let a = 0, b = 1, c, i;
if (n == 0)
return a;
for (let i = 2; i <= n; i++)
{
c = a + b;
a = b;
b = c;
}
return b;
}
Piastrelle
Dobbiamo piastrellare una sentiero largo 1m con delle piastrelle che esistono in 2 dimensioni: 1 × 1 m o 1 × 2 m. Quelle da 1 × 1 possono essere rosse o blu, quelle da 1 × 2 possono essere gialle, verdi o nere. Se il sentiero è lungo n metri, in quanti modi diversi può essere piastrellato? Scrivere una funzione contaPossibilita(n) che restituisca il numero di possibilità, data la lunghezza n. Suggerimento: trovare una relazione ricorsiva per calcolare il numero di possibilità, poi implementare la funzione in modo ricorsivo (preferibilmente in coda. Esempi:
contaPossibilita(1) → 2
contaPossibilita(7) → 1640
function piastrelle(n) {
if (n == 1)
return 2;
if (n == 2)
return 7;
return 2 * piastrelle(n-1) + 3*piastrelle(n-2);
}
function piastrelleCoda(n, p1=2,p2=7){
if(n==1)
return p1;
return piastrelleCoda(n-1,p2,p1*3+p2*2);
}