我有以下 Python 代码:
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。在Elisp 的高阶函数中,我被告知不要使用defun
within 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)))
但是,该函数i
在分配之前被调用let
,我得到一个错误 -*** Eval error *** Symbol's value as variable is void: i
如何在 Elisp 的 lambda 中进行递归?