Özyinelemeli Fonksiyonlar

Bahsi geçen fonksiyonları Bilal’e anlatır gibi sade ve eğlenceli bir şekilde anlatabilecek olan var mı?

Kendini cagiran fonksiyon. f fonksiyonu, f fonksiyonunu cagiriyorsa ozyinelemeli.

Konu basliklarini toplarsaniz eksikleri doldururum.

Anladığım kadarıyla döngüye benzer bir şekilde çalışıyor ama tam olarak nasıl çalıştığını kavrayamadım. Alttaki örneği aşama aşama, olabildiğince sade bir şekilde anlatırsanız sevinirim:

Adsz

Bu arada aşağıdaki bağlantıyı da ziyaret etmenizi öneririm.

def cift_sayi_toplam(sayi):
    if sayi == 0:
        return 0
    else:
        return sayi + cift_sayi_toplam(sayi - 2)
        
        
        
print(cift_sayi_toplam(6))

# Öz yinelemenin 1. adımı.
# sayi = 6
# if durumu atlanır.
# 6 + cift_sayi_toplam(4) ifadesi geri döner.

# Öz yinelemenin 2. adımı.
# sayi = 4
# if durumu atlanır.
# 6 + 4 + cift_sayi_toplam(2) ifadesi geri döner.

# Öz yinelemenin 3. adımı.
# sayi = 2
# if durumu atlanır.
# 6 + 4 + 2 + cift_sayi_toplam(0) ifadesi geri döner.

# Öz yinelemenin 4. adımı.
# sayi = 0
# if koşulu sağlanır ve 6 + 4 + 2 = 12 sayısı geri döner.
3 Beğeni

Teşekkürler, taşlar yerine oturdu nihayet.

def sayaç(sayı, sınır):
    if sayı == sınır:
        return 'bitti!'
    else:
        sayaç(sayı+1, sınır)
        print(sayı)

print(sayaç(0, 10))

Bu kod nasıl çalışıyor peki? @dildeolupbiten

Su sekilde oldugunu dusunsen anlaman daha kolaylasir mi acaba? :

def sayaç1(sayı, sınır):
    if sayı == sınır:
        return 'bitti!'
    else:
        sayaç2(sayı+1, sınır)
        print(sayı)

def sayaç2(sayı, sınır):
    if sayı == sınır:
        return 'bitti!'
    else:
        sayaç3(sayı+1, sınır)
        print(sayı)

def sayaç3(sayı, sınır):
    if sayı == sınır:
        return 'bitti!'
    else:
        sayaç4(sayı+1, sınır)
        print(sayı)

[...]

def sayaç98(sayı, sınır):
    if sayı == sınır:
        return 'bitti!'
    else:
        sayaç99(sayı+1, sınır)
        print(sayı)

def sayaç99(sayı, sınır):
    if sayı == sınır:
        return 'bitti!'
    else:
        raise RuntimeError("tamam, yeter")

print(sayaç(0, 10))
1 Beğeni

Aslında @aib’in belirttiği gibi, öz yinelemeli fonksiyonlarda, fonksiyonun argümanı değiştirilerek sürekli yeniden çağrılır.

Paylaştığınız kodları biraz açıklamaya çalışayım (öz yinelemenin 10 adımını da anlatmayacağım.). Mesela siz fonksiyonu return deyimi olmadan çağırmışsınız. Kodlarınızı aşağıdaki gibi değiştiriyorum.

def sayaç(sayı, sınır):
    if sayı == sınır:
        return 'bitti!'
    else:
        print(sayı)
        return sayaç(sayı+1, sınır)
        

print(sayaç(0, 10))

Bu yukarıdaki kodlar, sizin yazdığınız kodlardan biraz farklı çalışıyor. İstiyorsanız bunu anlatayım:

Şimdi sizin yazdığınız kodlara göre, else koşulu sağlandığı her seferde sayaç fonksiyonu sayı parametresi 1 arttırılarak çağrılacak ve daha sonra da print(sayı) ifadesi ekrana yazdırılacak. Ancak burada ekrana yazdırılacak ilk sayı 0 olmayacaktır. Çünkü else durumuna geçince fonksiyon tekrar çağrılıyor ta ki sayı değişkeni 10 olana kadar. 10 olduktan sonra da bütün sayı değişkenleri tek tek ekrana yazdırılıyor. Yazdırma sırası 9, 8, 7, 6 … şeklinde olacaktır ve "bitti!" yazısını almayacaksınız.

Oysa kodları yukarıda paylaştığım gibi düzenlerseniz. Alacağınız çıktı şöyle olacaktır:

0
1
2
3
4
5
6
7
8
9
bitti!

Fonksiyonu ancak return ederseniz, geri dönen değeri alabilirsiniz. Yoksa return ifadesini kullanmışsınız ama "bitti!" yazısının ekrana yazdırılması için çağrılan fonksiyonun da return edilmesi gerekiyor. Mesela aşağıdaki fonksiyonu bir inceleyin isterseniz. Yazdığınız fonksiyonda return ifadesini kullanmadığınız zaman aşağıdaki kodlara benzer bir yapı oluşturmuş olursunuz.

def f(arg):
    def g(arg):
        return arg
    g()
    # Halbuki burada return g() olmalıydı.

Yani aslında siz tıpkı yukarıdaki gibi fonksiyon içinde fonksiyon çağırıyorsunuz. Daha iç taraflarda kalan fonksiyonda return ifadesi var ancak en dıştaki fonksiyon alanında çağırdığınız iç fonksiyonu da return etmelisiniz ki, iç fonksiyondan dönen değeri alabilesiniz.

1 Beğeni