Rekursiv funktsiya o'zini chaqirganligi sababli, cheksiz tsikl bilan tugaydigan funktsiyani noto'g'ri yozish oson. Misol uchun, siz ortga hisoblashni chop etuvchi funktsiyani yozmoqchisiz, deylik:
> 3...2...1
Siz uni rekursiv tarzda yozishingiz mumkin, masalan:
def countdown(i):
print i
countdown(i-1)
func countdown(i int) {
fmt.Println(i)
countdown(i-1)
}
Ushbu kodni yozing va uni ishga tushiring. Muammoni sezasiz: bu funksiya abadiy ishlaydi!
> 3...2...1...0...-1...-2...-3...
(Skriptingizni o'chirish uchun Ctrl-C tugmalarini bosing.) Rekursiv funktsiyani yozganingizda, uni qachon takrorlashni to'xtatish kerakligini aytishingiz kerak. Shuning uchun har bir rekursiv funktsiya ikki qismdan iborat: asosiy va rekursiv holat. Rekursiv holat - bu funksiya o'zini chaqirganda. Asosiy holat - bu funktsiya o'zini qayta chaqirmasa ... shuning uchun u cheksiz tsiklga kirmaydi.
Ortga hisoblash funksiyasiga asosiy registrni qo'shamiz:
def countdown(i):
print i
if i <= 0:
return
else:
countdown(i-1)
func countdown(i int) {
fmt.Println(i)
if i <= 0 {
return
} else {
countdown(i-1)
}
}
Endi funksiya kutilganidek ishlaydi. Bu shunga o'xshash narsaga o'tadi.