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.
Okuyarak öğrenmek ile deneyerek öğrenmek arasındaki fark. Okuğunda dürüm olur.
Çalıştırdığında dürüm olmaz.
Çünkü dürümcü size ufak bir detayı anlatmayı unutmuş.
İşletim sistemleri çok görevli ger bir process e zaman tahsis edip sonra geri alan bir yapıdadır.
1940 tan kalma tek görevli bir işletim sistemi değilse, yada bir microkontrolcü için işletim sistemi olmadan yazılan bir kodsa belki. Dürüm olmaz da hard reset gerekebilir hepsi bu.
Bir programlama dili öğrenmek, sadece dil öğrenmek olmamalı. Arabayı tanımayıp, sürücülük öğrenmeye benzer.
Yolu tanıyın, trafiği tanıyın, aracınızı tanıyın, insan psikolojisini tanıyın bunların limitlerini öğrenin sonra sürücü olun.
Her zaman programcılara tavsiyen, programlarınızı koşturduğunuz (run) platformları iyi öğrenin, işletim sistemlerini iyi öğrenin sonra programlama dilini öğrenin derim.