Return ifadesi neden programı durdurmadı?

def factorial(number):
    if not isinstance(number, int):
        raise TypeError("Sorry. 'number' must be an integer.")
    if number < 0:
        raise ValueError("Sorry. 'number' must be zero or positive.")
    
    def inner_factorial(number):
        if number <= 1:
            return 1
        return number * inner_factorial(number - 1)
    return inner_factorial(number)

Selamlar herkese,bu programda bir yeri anlamadım.return number * inner_factorial(number - 1) ifadesindeki return neden programı durdurmadı.Yani bu faktoriyel bulma işlemini bu fonksiyon nasıl yaptı anlamadım return ifadesinden dolayı?Süreci anlatabilir misiniz acaba?

Çünkü return içerisinde başka bir fonksiyonu çağırıyor. Aslında bu tür fonksiyonlara özyineleme fonksiyonları denir. Daha rahat anlatmak adına şöyle bir örnek vereyim.


def factorial(number):
    if number < 0:
        raise ValueError("Negatif sayıların faktoriyeli hesaplanamaz!")
    elif number == 0:
        return 1
    else:
        return number * factorial(number-1)
        
       

Bu fonksiyonda parametre değeri olan number 0 oluncaya dek, fonksiyon en sondaki return ile kendisini çağırmaya devam eder. Her seferinde mevcut parametreyi bir azaltarak çağırır.

Buradaki olayı şöyle de özetleyebiliriz.
Mesela
factorial(4) dedigimizde

return 4 * factorial(4-1),
return 4 * 3 * factorial(3-1),
return 4 * 3 * 2 * factorial(2-1)
return 4 * 3 * 2 * 1 * factorial(1-1)
return 4 * 3 * 2 * 1 * 1

Bunun sonucunda 4*3*2*1*1 = 24 olarak bulunuyor.
Uzun hali
4 * ( 3 * ( 2 * ( 1 * (1) ) ) ) şeklindedir.

Sormakta olduğunuz şeye dönecek olursak, gördüğünüz gibi return ile alınmak istenen değer dallanarak gitmektedir. Bu değer net bir sonuca ulaşıncaya dek işlemler devam eder. Sonunda number == 0 olup da return içerisinde herhangi bir fonksiyon verilmediğinde, yani yeni bir dal oluşmadığında net değer döndürülür. Özyineleme fonksiyonlarının dallanma sınırı hatırladığım kadarıyla 999 idi. Yani 2000!'in hesaplanması bu yolla mümküm değildir.

3 Beğeni

Cevabınız için teşşekkür ederim açıklayıcı bir cevap olmuş :slight_smile:

1 Beğeni