Öz yinelemeli methodlarda örnek kodu anlamadım

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ırdaki print 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)

Çıktı:

özyineleme sürecine girerken: [5]
özyineleme sürecine girerken: [4]
özyineleme sürecine girerken: [3]
özyineleme sürecine girerken: [2]
özyineleme sürecine girerken: [1]
özyineleme sürecinden çıkarken: [1]
özyineleme sürecinden çıkarken: [2, 1]
özyineleme sürecinden çıkarken: [3, 2, 1]
özyineleme sürecinden çıkarken: [4, 3, 2, 1]
özyineleme sürecinden çıkarken: [5, 4, 3, 2, 1]

şuradan kodun çalışmasının görselleştirilmesine bakabilirsiniz

https://pythontutor.com

bir de şurada bir şeyler konuşulmuş