私は次の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)
それをEmacsLispに翻訳したいと思います。Elispの高階関数では、関数をグローバルに有効にするため、defun
内で使用しないように指示されたため、代わりにラムダを記述しました。defun
しかし、ラムダ呼び出し自体を再帰的に行う必要があります。
私のコードは次のとおりです。
(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のラムダで再帰を行うにはどうすればよいですか?