İyi derecede Python bildiğini iddia eden bir geliştiriciden, mülakat sırasında faktöryel hesaplayan bir kod yazması istenmiş. Geliştirici de aşağıdaki kodu yazmış:
def factorial(n):
x = 1
while 1 < n:
x *= n
n -= 1
return x
Mülakatı yapan, geliştiricinin bu problemi recursion kullanarak çözmemesi karşısında şaşırmış ve “Recursion’dan haberdar mısınız?” diye sormuş, ulaka bir tavırla. Beklediği kod, aşağıdaki gibiymiş:
def factorial(n):
if n == 1:
return 1
else:
return n * factorial(n - 1)
Geliştirici soğukkanlılıkla “Peki siz Python’daki recursion limitten haberdar mısınız?” demiş bunun karşısında. Mülakatı geçebilmiş mi, bilmiyorum. Uzun zaman önce duyduğum bir hikaye bu. Kullanılan araçları tanımanın, en az veriyapıları ve algoritmalar kadar önemli olduğunu hatırlatır bana.
Python’daki recursion-limit yüzünden, en fazla sys.getrecursionlimit() kadar (son baktığımda 1000 idi) derine inebilirsiniz. 1000!‘e kadar olan değerleri iki fonksiyonla da düzgün hesaplarken, 1001! ve sonrasını recursive olarak çözmeden önce sys.setrecursionlimit(x) ile limiti yükseltmeniz gerekir. Python ile kod yazıyor ama Python’u yeterince tanımıyorsanız, ilişkinizde inişler yaşamanız muhtemel. “Python ile program yazdım” ya da “Python ile proje geliştirdim” diyebilirsiniz, ancak “Python biliyorum” demeden önce iyi düşünmek gerekiyor :)
Pythonic bir yol istiyorsanız, aşağıdaki kodu da kullanabilirsiniz:
import operator factorial = lambda x: reduce(operator.mul, range(1, x + 1)) print factorial(1001)















