def azalt(s):
if len(s) < 1:
return s
else:
print(‘özyineleme sürecine girerken:’, s)
azalt(s[1:])
print(‘özyineleme sürecinden çıkarken:’, s)
azalt(‘istihza’)
bu kodda if komutuna girip return ile s i döndürdükten sonra neden else komutundaki “print(‘özyineleme sürecinden çıkarken:’, s)” bu kodu çalıştırıyor anlamadım.
Burada ilk olarak print ifadesi ile s’in öz-yinelemeye girmeden önceki değeri ekrana yazdırılır.
Sonra azalt(s[1:]) ifadesi ile fonksiyon tekrar çağrılır. Alt satırdaki print ifadesine geçilmez.
Fonksiyon tekrar çağrıldığında, önce yeni s ekrana yazdırılır. Sonra yine azalt fonksiyonu s değeri azaltılarak çağrılır. Bu çağırma sonucunda da print ifadesine geçilmez.
Fonksiyon öz yinelemeye s boş bir karakter dizisi olana kadar devam eder. Ve her bir çağırma için alt satırdakiprint ifadesi atlanır, çünkü o noktada fonksiyonu tekrar çağırmış oluyoruz.
s = "" olduğunda, bu kez öz-yineleme yapmayacağı için, artık azalt fonksiyonunun bir türlü çalışmayan ikinci print ifadesi çalışmaya başlar. s toplamda 7 kez çağrıldı. Son çağrıdan başlayarak bütün çağrılar için alt satırdaki print ifadesi çalışmaya başlar.
Benzer bir örnek yapalım isterseniz:
def azalt(n):
liste = []
if n > 0:
# Mesela burada liste'ye n'i ekleyeceğiz.
# Fonksiyon her çağrıldığında liste boş bir liste
# olarak karşımıza çıkacak.
# Bu yüzden özyineleme sürecine girerken liste hep tek elemanlıdır.
liste.append(n)
print('özyineleme sürecine girerken:', liste)
# Buradaki ifade öz-yinelemeden dönecek olan değerleri liste'ye ekleyecek.
liste += azalt(n - 1)
# Burada da listenin genişlediğini göreceksiniz.
print('özyineleme sürecinden çıkarken:', liste)
# Öz yinelemenin her bir adımında bu return ifadesi çalışır.
# azalttan dönen değer liste olduğuna göre,
# liste += liste ile de elemanları liste'ye tersten eklemiş oluruz.
return liste
azalt(5)