Yukardaki azalt
fonksiyonundaki ilk satırda önce s
argümanından gelen değerin uzunluğunun 1’den küçük olup olmadığına bakılıyor. Şayet küçükse, return s
ifadesi ile de s
’in son hali geri döndürülüyor. s
’in son hali diyorum çünkü bu fonksiyonda s
sürekli değişen bir yapıda. s
’in alacağı son değer boş bir str
verisi yani ""
olacaktır.
Şayet s
’in uzunluğu 1
’den büyükse, ekrana s
yazdırılır, sonra da azalt
fonksiyonu, kendisine argüman olarak s
yerine s[1:]
verilerek çağrılır.
s = "istihza"
print(s)
print(s[1:])
Özyinelemenin ilk adımında s
argümanının alacağı değer s[1:]
olur bunun değeri de stihza
. İkinci adımda s[1:]
ifadesi tihza
olur. Yani fonksiyonu ilk çağrırken ona s
isminde bir argüman verdiniz. Aynı değeri, sadece ilk sırasındaki elemanı almadan fonksiyona tekrar argüman olarak veriyorsunuz ve fonksiyonu çağırıyorsunuz. Dolayısıyla elinizdeki argümanların değişen durumlarına göre özyinelemeyi yapıyorsunuz. if len(s) < 1
ifadesiyle de zaten s
’in uzunluğunun azalacağını bildiğiniz için bu durumda ne yapılması gerektiğini tanımlamış oluyorsunuz. Genelde bu durumda fonksiyonun işi de biter.
Yukardaki factorial
fonksiyonunun ilk satırında n
’in 0
’a veya 1
’e eşit olup olmadığı sorgulanır. Eşitse 1
döndürülür. Değilse, n * factorial(n - 1)
ifadesi döner.
Şimdi burada neden n
’i bir fonksiyonla çarpıp geri döndürüyoruz diye düşünmüş olabilirsiniz. Bu bahsettiğim ifade hem aynı anda n
’in aldığı değeri döndürüyor hem de kendisini n
’in değerini 1
azaltarak döndürüyor. Yani:
return n * factorial(n - 1)
Yukardaki ifadede factorial(n - 1)
fonksiyonu neyi geri döndüyor? (n - 1) * factorial(n - 2)
ifadesini döndürmez mi?
Matematikten hatırlayalım:
f(x) = x * f(x - 1)
f(x - 1) = (x - 1) * f(x - 2)
O halde (n - 1) * factorial(n - 2)
ifadesini alıp, factorial(n - 1)
gördüğümüz yere yazalım.
return n * (n - 1) * factorial(n - 2)
Peki, aynı şekilde factorial(n - 2)
'nin de ne döndüreceğine bakalım.
(n - 2) * factorial(n - 3)
O zaman factorial(n - 2)
gördüğüm yere de yukardaki ifadeyi yazabilirim.
return n * (n - 1) * (n - 2) * factorial(n - 3)
Bu işlemler, yazdığınız koda göre n = 1
veya n = 0
durumuna kadar yapılacaktır. n = 1
durumunda elimizde ne olacak? return 1
. Daha önceden return
edilen n
değerlerimiz vardı, yukarda göstermiştim. O halde son olarak dönecek olan değer şöyle bir değer olacaktır.
return n * (n - 1) * (n - 2) * ... * 1
Umarım anlatabilmişimdir.