Python’da Özyineleme (Recursive)
Bu öğreticide, özyinelemeli bir işlev (kendini çağıran bir işlev) oluşturmayı öğreneceksiniz.
özyineleme nedir?
Özyineleme, bir şeyi kendi içinde tanımlama sürecidir.
Fiziksel bir dünya örneği, birbirine bakan iki paralel ayna yerleştirmek olacaktır. Aralarındaki herhangi bir nesne özyinelemeli olarak yansıtılacaktır.
Python Özyinelemeli İşlev
Python’da bir fonksiyonun diğer fonksiyonları çağırabileceğini biliyoruz . Fonksiyonun kendisini çağırması bile mümkündür. Bu tür yapılar özyinelemeli işlevler olarak adlandırılır.
Aşağıdaki görüntü, adlı özyinelemeli bir işlevin çalışmasını göstermektedir recurse
.

Aşağıda bir tamsayının faktöriyelini bulmak için özyinelemeli bir fonksiyon örneği verilmiştir.
Bir sayının faktöriyeli, 1’den o sayıya kadar olan tüm tam sayıların çarpımıdır. Örneğin, 6’nın faktöriyeli (6 ile gösterilir!)1*2*3*4*5*6 = 720.
Özyinelemeli bir fonksiyon örneği
1 2 3 4 5 6 7 8 9 10 11 12 | def factorial(x): """This is a recursive function to find the factorial of an integer""" if x == 1: return 1 else: return (x * factorial(x-1)) num = 3 print("The factorial of", num, "is", factorial(num)) |
Çıktı
1 | <samp>3'ün faktöriyeli 6'dır</samp> |
Yukarıdaki örnekte, factorial()
kendisini çağırdığı şekliyle özyinelemeli bir işlevdir.
Bu fonksiyonu pozitif bir tamsayı ile çağırdığımızda, sayıyı azaltarak özyinelemeli olarak kendini çağıracaktır.
Her fonksiyon, sayıyı bire eşit olana kadar altındaki sayının faktöriyeliyle çarpar. Bu özyinelemeli çağrı aşağıdaki adımlarda açıklanabilir.
1 2 3 4 5 6 | faktöriyel(3) # 3 ile 1. çağrı 3 * faktöriyel(2) # 2 ile 2. çağrı 3 * 2 * faktöriyel(1) # 1 ile 3. çağrı 3 * 2 * 1 # 3. aramadan sayı=1 olarak dönüş 3 * 2 # 2. çağrıdan dönüş 6 # 1. aramadan dönüş |
Neler olup bittiğine dair adım adım süreci gösteren bir resme bakalım:

Sayı 1’e düştüğünde özyinelememiz sona erer. Buna temel koşul denir.
Her özyinelemeli işlevin özyinelemeyi durduran bir temel koşulu olmalıdır, aksi takdirde işlev kendisini sonsuz olarak çağırır.
Python yorumlayıcısı, yığın taşmalarına neden olan sonsuz yinelemelerden kaçınmaya yardımcı olmak için yinelemenin derinliklerini sınırlar.
Varsayılan olarak, maksimum özyineleme derinliği1000. Sınır aşılırsa, sonuçlanır RecursionError
. Böyle bir duruma bakalım.
1 2 3 | def recursor(): recursor() recursor() |
Çıktı
1 2 3 4 5 6 7 | <samp>Geri izleme (en son arama son): Dosya "<string>", satır 3, <module> içinde Dosya "<string>", 2. satır, bir Dosya "<string>", 2. satır, bir Dosya "<string>", 2. satır, bir [Önceki satır 996 kez daha tekrarlandı] RecursionError: maksimum yineleme derinliği aşıldı</samp> |
Özyinelemenin Avantajları
- Özyinelemeli işlevler, kodun temiz ve zarif görünmesini sağlar.
- Karmaşık bir görev, özyineleme kullanılarak daha basit alt problemlere bölünebilir.
- Dizi oluşturma, özyineleme ile iç içe geçmiş bir yineleme kullanmaktan daha kolaydır.
Özyinelemenin Dezavantajları
- Bazen özyinelemenin arkasındaki mantığı takip etmek zordur.
- Özyinelemeli çağrılar, çok fazla bellek ve zaman harcadıkları için pahalıdır (verimsizdir).
- Özyinelemeli işlevlerde hata ayıklamak zordur.