Özyinelemeli (Recursive ) Fonksiyonlar

Ekran%20Al%C4%B1nt%C4%B1s%C4%B1
i=0
a=0
def azalt(s):
global a,i
if len(s) < 1:
a+=1
print(“a:”,a)
return s
else:
i+=1
print(“i:”,i)
print(‘özyineleme sürecine girerken:’, s)
azalt(s[1:])
print(‘özyineleme sürecinden çıkarken:’, s)
azalt(‘istihza’)
Bu kodu yazıyorum fakat anlamadığım bir nokta var. ‘azalt(s[1:])’ kodundan sonra altdaki print neden Çalışır? “azalt(s[1:])” satırı ile fonksiyon süreki bir çevrimde fakat “if len(s) < 1:” satırında biz bu fonksiyonu bitirmiyor muyuz? Nasıl olurda “print(‘özyineleme sürecinden çıkarken:’, s)” satırı ‘istihza’ kelimesini tersden yazıyor? Bunu anlayamadım yardım eder misiniz?
Teşekkürler…

3 Beğeni

girintiler gözükmemiş bu kodu https://belgeler.yazbel.com/python-istihza/ileri_fonksiyonlar.html#ozyinelemeli-recursive-fonksiyonlar burdaki örneklerden aldım sadece anlamak için i ve a sayaçları koydum

1 Beğeni

Selamun Aleyküm

1. def azalt(s):
2.     if len(s) < 1:
3.         return s
4.     else:
5.         print('özyineleme sürecine girerken:', s)
6.         azalt(s[1:])
7.         print('özyineleme sürecinden çıkarken:', s)

8. azalt('istihza')

Yukarıdaki kodlarda benim anladığım kadarı ile öz yinelemeli azalt() fonksiyonu ilk çalışmaya başladığı anda içerisine parametre olarak girilmiş 'istihza' stringinin uzunluğu 1’den küçük olmadığı için else bloğunun içi çalışıyor.

Bu blok içerisinde ilk olarak (5. satırda) string ekrana basılıyor. 6. satırda ise stringimizin 1. karakterinden sonuna kadarki kısmı 'stihza' tekrardan fonksiyona parametre olarak gönderiliyor. Bu nedenle program 7. satırı çalıştırmadan tekrar başa dönüyor. Her seferinde parametre olarak girilen stringin ilk harfi [1:] ifadesi ile çıkarılarak, geriye kalan kısmı tekrardan parametre olarak verilip fonksiyon tekrar çağrılıyor.

Ardından stringimiz tamamen boşalınca if bloğu içerisindeki return s kodu çalışıyor ve öz yineleme işlemi bitiriliyor. Bu andan sonra ise öz yinelemeli fonksiyonların yapısı gereyi yapılan tüm işlemler adım adım geri alınıyor. Bu nedenle 7. satırdaki kod çalışmaya başlıyor.

Kısacası fonksiyonun içerisinde aynı fonksiyonun tekrar çağrılmasını sağlayan azalt(s[1:]) kodu sayesinde kendini yineleyen fonksiyon, yineleme işlemi bittikten sonra azalt(s[1:]) kodundan sonraki satırı çalışıyor. Tabi bu esnada da yapılan işlemler bir anlamda geri alındığı (geri alınma kavramı belki tam oturmadı başka bir şey bulamadım) için print() fonksiyonu sayesinde zamanı geri sarar gibi değişkenin adım adım eski halini tekrar görebiliyoruz.

Gördüğünüz gibi fonksiyon özyineleme sürecine girerken düşürdüğü her bir karakteri, özyineleme sürecinden çıkarken yeniden döndürüyor. Bu, özyinelemeli fonksiyonların önemli bir özelliğidir.” ÖZGÜL, F.

Bu arada aşağıdaki bağlantıyı da incelemenizde fayda var. Kodlarınız okunaklı olursa buradaki bilgili arkadaşlar size daha çabuk destek olabilirler.

AleykümSelam.
İlginiz için tesekkür ederim öncelikle
Özyinelemeli fonksiyonu ilk defa pythonda gördüğüm için biraz algılamakta problem yaşıyorum.
Çok güzel anlatmışsınız ama aklıma oturmayan bir şey var. Bu fonksiyon bir while veya for döngüsüne benzer nitelikte midir? Yani azalt(s[1:]) kodunda bir noktaya kadar kendini tekrar ediyor sonra otomatik olarak bu döngünün alt satırlarında varsa olan kodları ters çeviriyor.
Bu kurgulama doğru mudur?

if len(s) < 1:

Fırat ÖZGÜL’ün notlarında öz yinelemeli fonksiyonun sürekli kendi kendini çağırmasını sonlandırmak için bir dip nokta olması gerektiği yazıyor. Yukarıdaki if bloğunda bu dip nokta ayarlanmış. Eğer bu yapılmasaydı bir süre sonra string içerisinde karakter kalmayacağı için program hata verecekti.

Kodları tersine çevirme ifadesi biraz yanlış. Aşağıdaki kaynaktan bulduğum açıklama sanırım olayı biraz daha anlamamıza yardımcı olacak.

Öz Yineleme (Recursion)

Kendi kendini çağıran fonksiyonlara özyineli (recursive) fonksiyon denilir.

Çoğunlukla, döngülerle çözülebilen problemler, özyineli fonksiyonlarla çok daha kolay olarak çözülebilir. Özyineleme eylemi, problemi, en üstten başlayarak adım adım daha küçük parçalarına ayırır. Daha çok parçalanamayn en basit parçasına taban parçası denilir. Özyineleme en üstten başlayarak tabana kadar iner. Sonra tabanda bulduğu değeri geriye doğru en üste kadar taşır. Bu niteliği, döngülerden farklıdır.
Kaynak: http://www.baskent.edu.tr/~tkaracay/etudio/ders/prg/c/recursive.pdf

Yani öz yineli fonksiyon içerinde verilen parametre her seferinde küçülüyor ve dip noktaya (taban parçaya) geldiğinde return ifadesi ile yineleme işlemi durduruluyor. Taban parça (en küçük değere ulaşan parametre) döngü bittikten sonra adım adım ilk değerine getiriliyor. Fırat ÖZGÜL’ün yukarıda yaptığı örnekte azalt(s[1:]) kodundan sonraki print satırı, öz yineleme işlemi neticesinde küçülen parametre değerinin nasıl eski haline geldiğini görüp kavramamız için yazılmış. :slight_smile:

Çok teşekkür ederim yardımlarınız için.
Kafamda bir kaç şey şekillendi biraz daha örnek yaparak kavrıyacağım elinize sağlık. :slight_smile:

Çok güzel anlatmışsınız, ellerinize sağlık. Ama bende hala tam yerine oturmayan şeyler var. Mesela en sonda nasıl geriye alınıyor tüm kodlar? Yani, o recursion kodunun altındaki kod nasıl çalışıyor tam olarak? Basit bir örnek üzerinden adım adım, tane tane anlatabilirseniz çok makbule geçer. Hem o geri alınma olayını hem de özyineli fonksiyonları genel olarak.

https://thonny.org/

Bu IDE’yi kullanarak, ne olup bittiğini görsel olarak gördükten sonra tüm taşlar yerine oturdu. Recursion konusunda kafası karışanlara recursive fonksiyonları üstteki IDE’de, CTRL + F5’e basıp ya da IDE’nin üstündeki sekmelerden Run > Debug Current Script (nicer)'e basıp, tüm olup biteni görsel olarak izlemelerini tavsiye ederim. Görsel anlatımın yeri başka.

Ayrıca şu kaynakta olabildiğince sade ve anlaşılabilir anlatmışlar, öneririm:

https://caylakyazilimci.com/post/recursive-fonksiyon-nedir-python-101-6

1 Beğeni