Özyinelemeli işlev, kendi kendine çağıran bir işlevdir
Programcıların minimum miktarda kod kullanarak verimli programlar yazmasına olanak tanır .
Dezavantajı, düzgün yazılmazsa sonsuz döngülere ve diğer beklenmedik sonuçlara neden olabilmeleridir. .
Hem Basit Özyinelemeli işlevi hem de Kuyruk Özyinelemeli işlevi açıklayacağım
Basit bir özyinelemeli fonksiyon yazmak için
- Dikkate alınması gereken ilk nokta, if döngüsü olan döngüden çıkmaya ne zaman karar vermeniz gerektiğidir.
- İkincisi, kendi işlevimizsek ne yapacağımızdır
Verilen örnekten:
public static int fact(int n){
if(n <=1)
return 1;
else
return n * fact(n-1);
}
Yukarıdaki örnekten
if(n <=1)
return 1;
Döngüden ne zaman çıkılacağına karar veren faktör
else
return n * fact(n-1);
Gerçek işlem yapılacak mı
Kolay anlaşılması için görevi tek tek kırmama izin verin.
Koşarsam içeride ne olacağını görelim fact(4)
- N = 4 yerine
public static int fact(4){
if(4 <=1)
return 1;
else
return 4 * fact(4-1);
}
If
döngü başarısız olduğundan döngüye gider, else
böylece geri döner4 * fact(3)
Yığın hafızada, 4 * fact(3)
N = 3 yerine
public static int fact(3){
if(3 <=1)
return 1;
else
return 3 * fact(3-1);
}
If
döngü başarısız olduğu için gider else
döngüye
bu yüzden geri döner 3 * fact(2)
`` 4 * fact (3) '' dediğimizi hatırlayın
İçin çıktı fact(3) = 3 * fact(2)
Şimdiye kadar yığın var 4 * fact(3) = 4 * 3 * fact(2)
Yığın hafızada, 4 * 3 * fact(2)
N = 2 yerine
public static int fact(2){
if(2 <=1)
return 1;
else
return 2 * fact(2-1);
}
If
döngü başarısız olduğu için else
döngüye gider
bu yüzden geri döner 2 * fact(1)
Hatırla aradık 4 * 3 * fact(2)
İçin çıktı fact(2) = 2 * fact(1)
Şimdiye kadar yığın var 4 * 3 * fact(2) = 4 * 3 * 2 * fact(1)
Yığın hafızada, 4 * 3 * 2 * fact(1)
N = 1 yerine
public static int fact(1){
if(1 <=1)
return 1;
else
return 1 * fact(1-1);
}
If
döngü doğrudur
bu yüzden geri döner 1
Hatırla aradık 4 * 3 * 2 * fact(1)
İçin çıktı fact(1) = 1
Şimdiye kadar yığın var 4 * 3 * 2 * fact(1) = 4 * 3 * 2 * 1
Son olarak, olgunun sonucu (4) = 4 * 3 * 2 * 1 = 24
Kuyruk Özyineleme olurdu
public static int fact(x, running_total=1) {
if (x==1) {
return running_total;
} else {
return fact(x-1, running_total*x);
}
}
- N = 4 yerine
public static int fact(4, running_total=1) {
if (x==1) {
return running_total;
} else {
return fact(4-1, running_total*4);
}
}
If
döngü başarısız olduğundan döngüye gider, else
böylece geri dönerfact(3, 4)
Yığın hafızada, fact(3, 4)
N = 3 yerine
public static int fact(3, running_total=4) {
if (x==1) {
return running_total;
} else {
return fact(3-1, 4*3);
}
}
If
döngü başarısız olduğu için else
döngüye gider
bu yüzden geri döner fact(2, 12)
Yığın hafızada, fact(2, 12)
N = 2 yerine
public static int fact(2, running_total=12) {
if (x==1) {
return running_total;
} else {
return fact(2-1, 12*2);
}
}
If
döngü başarısız olduğu için else
döngüye gider
bu yüzden geri döner fact(1, 24)
Yığın hafızada, fact(1, 24)
N = 1 yerine
public static int fact(1, running_total=24) {
if (x==1) {
return running_total;
} else {
return fact(1-1, 24*1);
}
}
If
döngü doğrudur
bu yüzden geri döner running_total
İçin çıktı running_total = 24
Son olarak, olgunun sonucu (4,1) = 24