Recursive Fonksiyon nedir? - Python 101 #6

Recursive Fonksiyon nedir?

Recursive fonksiyon, içerisinde kendini çağıran fonksiyondur. Programlamada en çok kafa karıştıran şeyler arasında yer alan bu fonksiyon tipine gelin yakından göz gezdirelim.

def recursive_fonksiyon(sayi):
    return recursive_fonksiyon(sayi/2)

recursive_fonksiyon(5)

 

Sizce bu fonksiyonu çağırdığımızda çalışacak mı? Eğer bu fonksiyonu çalıştırırsak;

RuntimeError: maximum recursion depth exceeded

Yukarıda görülen hata ile karşılaşırız. Peki bu hata bize neyi söylemektedir? Nerede hata yapmaktayız? 

Recursive fonksiyonların çalışıp çalışmayacağına emin olmamız için ilk önce düşünmemiz gereken şey; fonksiyon her çağrıldığında yapılan işin bir önceki çağrılmaya göre azaldığı olmalı. Yani, recursive fonksiyonlar döngüler gibi çalıştığından dolayı yapılan işin bir sınırı olmalı ve her bir adımdan sonra fonksiyonumuzun bu sınıra yaklaştığına emin olmalıyız. Bu sınırları oluşturmak ve recursive fonksiyonların nasıl çalıştığını anlamak için konuyu biraz daha detaylandıralım.

Recursive fonksiyon nasıl çalışır?

Recursive fonksiyonlar iki kısımdan oluşur.

1 - ) Base Case(Temel Durumlar/Şartlar)

Base Case daima fonksiyonumuzun başlangıcında yazılan ve fonksiyonumuzun sınırlarını belirleyen kısımdır. Base Case kısmında fonksiyonumuz tekrardan çağırılmaz, sabit bir değer geri döndürür. Bu sayede fonksiyonumuzu sınırlandırmış oluruz. Kısaca açıklamak gerekirse; Base Case yukarıda aldığımız Runtime hatasını engelleyen ve fonksiyonun bir döngü gibi çalışmasını sağlayan kısımdır.

2 - ) Recursive Case(Yinelenen Durum)

Bu kısmı döngümüzün içerisinde çalışan kodlar olarak düşünebiliriz. Yani sürekli bir değeri geri döndüren ve fonksiyonumuzu tekrar tekrar çağıracak olan kısım burasıdır.

Tanımlamaları bitirdiğimize göre örnekler üzerinden inceleme yapmaya devam edebiliriz.

Örnek - 1

Aldığımız sayıdan 0'a kadar olan bütün sayıların toplamını hesaplayan bir recursive fonksiyon yazalım.

def toplam(sayi):
    # Base Case(Temel Durum)
    if sayi == 1:
        # Bu fonksiyon icin sinirimiz recursive kisimda
        # azaltilan sayinin 1'e esit olma durumu
        return 1
    # Recursive Case(Yinelenen Durum)
    else:
        return sayi + toplam(sayi - 1)

Fonksiyonumuzun adım adım nasıl işlediğine bir göz atalım.

toplam(5)
return 5 + toplam(4)
    return 4 + toplam(3)
          return 3 + toplam(2)
                return 2 + toplam(1)
                       return 1

Daha sonra ise işlemin nasıl devam ettiğini aşağıdan takip edebiliriz.

return 5 + toplam(4)
    return 4 + toplam(3)
          return 3 + toplam(2)
                return 2 + toplam(1)
                       return 1
-----------------------------------
return 5 + toplam(4)
    return 4 + toplam(3)
          return 3 + toplam(2)
                return 2 + 1
-----------------------------------
return 5 + toplam(4)
    return 4 + toplam(3)
          return 3 + 3
-----------------------------------
return 5 + toplam(4)
    return 4 + 6
-----------------------------------
return 5 + 10
-----------------------------------
Sonuç = 15

Bu örneğin recursive fonksiyonun nasıl çalıştığını anlamamız adına bize çok yardımcı olacaktır diye düşünüyorum.

Makalenin geri kısmında recursive fonksiyonu pekiştirmek adına örnekleri paylaşacağım.

ÖNERİ #1 : Recursive fonksiyonlar ile çalışmanız gerekiyorsa ve recursive fonksiyonlar üzerinde çalışmakta sıkıntı yaşıyorsanız, yapmaya çalıştığınız şeyi ilk önce bir döngü üzerinden yapmanızı daha sonrasında ise recursive fonksiyona dökmenizi öneririm. Döngüler, size süreci güzel bir şekilde açıklayacaktır.

ÖRNEK - 2

Çift bir sayıyı parametre olarak alan ve aldığı sayıdan 0'a kadar olan çift sayıların toplamını yazdıran bir recursive fonksiyonu yazalım. (Örneğin değer 6 ise çıktı 6 + 4 + 2 = 12 olmalı)

def cift_sayi_toplam(sayi):
    #base case
    if sayi == 0:
        return 0
    #recursive case
    else:
        return sayi + cift_sayi_toplam(sayi - 2)

ÖRNEK - 3

Alınan negatif bir sayıdan 0'a kadar olan sayıların toplamını hesaplayan bir recursive fonksiyonu yazalım. (Base Case'e dikkat)

def negatif_toplam(sayi):
    # Base Case
    # Negatif sayıların toplamını hesapladığımızdan dolayı
    # artık sınırımız 1 değil -1 olmalı
    if sayi == -1:
        return -1
    # Recursive Case
    # Negatif değerler toplamı olduğundan dolayı fonksiyonumuz sayıyı bu sefer arttırmalı
    return sayi + negatif_toplam(sayi+1)

ÖRNEK - 4

Aldığı sayının kaç basamaklı olduğunu yazdıran bir recursive fonksiyonu yazalım. (Örneğin sayı 1234 ise çıktı 4 olmalı. (İpucu: Mod kullanımı :))

def basamak_sayisi(sayi):
    if sayi%10 < 1:
        return sayi
    else:
        return 1 + basamak_sayisi(sayi/10)

ÖRNEK - 5

Fibonacci dizisini aldığı sayıya kadar devam ettiren bir recursive fonksiyon yazalım.

Fibonacci Dizisi (0 1 1 2 3 5 8 13 21 34 ...)

def fibonacci(sayi):
    # Base Case
    if sayi == 0:
        return 0
    elif sayi == 1:
        return 1
    # Recursive Case
    else:
        return fibonacci(sayi-1) + fibonacci(sayi-2)

OKUR İÇİN ALIŞTIRMA

Aldığı sayıdan 0' a kadar olan sayıların çarpımını yapan aşağıdaki fonksiyonda bir hata bulunmaktadır. Bu hatayı kendi başınıza çözebiliyorsanız recursive fonksiyonları kavramışsınız demektir. Cevapları yorum olarak yazabilirsiniz.

def sifira_kadar_carp(sayi):
    if sayi == 0: 
        return 0
    return sayi * sifira_kadar_carp(sayi-1)

print sifira_kadar_carp(4)

İpucu: İşleyişte bir sıkıntımız var, sonuc 0 geliyor

 

Bir sonraki yazıda görüşmek üzere...

 

 

 

 

 

Comments (5) -

  • def sifira_kadar_carp(sayi):
        if sayi == 1:
            return 1
        return sayi * sifira_kadar_carp(sayi - 1)


    print (sifira_kadar_carp(6))
  • def sifira_kadar_carp(sayi):
        if sayi == 1:
            return 1
        else:
            return sayi * sifira_kadar_carp(sayi - 1)


    print (sifira_kadar_carp(4))
  • yalnız çok güzel bi  faktorial çözümü

Add comment