Recursive (yinelemeli) metotlar programlamada yaygın kullanılan konseptlerden biridir. Bunu kendi başınıza keşfetmiş olmanız ne kadar analitik düşünebildiğinizin güzel bir kanıtıdır.
def fib(n): return n if n <= 1 else fib(n - 1) + fib(n - 2)
print(fib(10)) # 55
Recursive Fonksiyonların Avantajları
Algoritmik olarak daha doğal ifade edilebilir: Özellikle Fibonacci, faktöriyel, ağaç yapıları veya grafik dolaşımı (DFS) gibi problemler matematiksel tanımı gereği recursive düşünülür.
Kod okunabilirliği yüksek olabilir: Bazı algoritmalar döngü yerine recursive yazıldığında çok daha kısa ve anlaşılır olur.
Bazı veri yapıları için doğaldır: Örneğin, Binary Tree gibi (worst case O(log n)) “ağacın sol ve sağ alt düğümlerini dolaş” gibi hiyerarşik yapılarda recursive yaklaşım mantıklı olur.
Recursive fonksiyonlarda her çağrıda stack’e yeni bir fonksiyon hafıza bloğu eklenir. Önceki çağrı tamamlanmadan bu bloklar hafızadan silinmez, bu yüzden derin recursion performans ve stack taşması açısından risklidir.**
Döngülere göre çok daha yavaş çalışır.
RecursionError riski vardır (varsayılan limit ~1000 çağrı).
import sys
sys.getrecursionlimit()
Exponential zaman karmaşıklığı (özellikle Fibonacci gibi tekrar hesaplanan problemlerde).
Her çağrı fonksiyon çağrısı overhead içerdiğinden performans açısından dezavantajlıdır.
Ne Zaman Recursive Kullanılmalı?
Kullanım Durumu
Recursive Uygun mu?
Matematiksel tanım (Fibonacci, Faktöriyel)
Ağaç / Grafik dolaşımı (DFS, Post-order traversal)
Basit tekrarlı işlemler (Sayaç, toplam, döngü)
X (döngü kullan)
Performans kritikse
X
Derinlik küçükse (≤ 50)
Performans için Alternatif
Eğer Fibonacci gibi hesaplamaların daha hızlı yapılması gerekiyorsa, memoization veya iterative yöntem kullanılmalıdır:
from functools import lru_cache
@lru_cache(maxsize=None)
def fib_fast(n):
return n if n <= 1 else fib_fast(n - 1) + fib_fast(n - 2)
Daha önce karşılaştınız mı bilmiyorum ama önce aşağıdaki bağlantılara bir göz atmanızı tavsiye ederim:
Fibonacci serisinin karakteristik polinomu: \phi^2 - \phi - 1 .
Bu polinomu açtığımızda şöyle bir indüksiyon elde ederiz: \phi^n = F_{n}\phi + F_{n-1} . F_n , n . sıradaki fibonacci sayısını veren fonksiyondur.
Bu sonuca nasıl ulaştığımız yukarıdaki linklerde yer alıyor. Ama tekrar hatırlayıp polinomu modüler aritmetiğe göre temsil edelim.
\phi^2 = \phi + 1 x^2 \equiv x + 1 \pmod{x^2 - x - 1} x^2 \pmod{x^2 - x - 1} = x + 1
Kanıt: x’in yerine herhangi bir sayı yazın ve karakteristik polinomu kullanarak modüler aritmetik işlemini sonuçlandırın.