我有以下Python代碼:遞歸拉姆達在elisp的
def sum_fibonacci():
'''Project Euler: 2
Sum of even-valued terms of Fibonacci sequence < 4 mil
'''
def i(a, b, acc):
if a >= 4000000: return acc
if a % 2 == 0:
return i(a + b, a, acc + a)
else: return i(a + b, a, acc)
return i(2, 1, 0)
我想將它翻譯成的Emacs Lisp。在Higher-order functions in Elisp我被告知不要在defun
內使用defun
,因爲它啓用了全局函數,所以我寫了lambda代替。但是我需要遞歸地調用lambda。
我的代碼是:
(defun sum-fibonacci()
(let ((i
(lambda (a b acc)
(cond ((>= a 4000000) acc)
((evenp a) (funcall i (+ a b) a (+ a acc)))
(t (funcall i (+ a b) a acc))))))
(funcall i 2 1 0)))
但是它與let
分配前的功能i
被調用,我得到一個錯誤 - *** Eval error *** Symbol's value as variable is void: i
怎樣在elisp的做遞歸拉姆達?
您可能還想發現'flet'。 – tripleee