我想尝试学习 Lisp,但很快就放弃了。我想我会再试一次。我正在研究欧拉计划中的问题 2——找出所有低于 400 万的偶数斐波那契数的总和。
我编写了以下代码,它可以工作,但很丑陋。其中最主要的是它非常慢 - 因为它一直在进行天真的递归。
当我用 Python 编写这个程序时,我在计算并且从不重新计算数字时建立了一个列表。我知道我可以在这里(以某种方式)做到这一点,但这似乎不符合 lisp 和函数式编程的精神。我在 #3 之后放弃了,当我达到递归深度限制并且不得不重写我的代码以使用循环而不是递归时。
所以我想我的问题是:
- 解决这个问题的“正确、笨拙的方式”是什么?
- 你如何协调递归和“计算一切”的概念与计算一切的实际限制?
- 除了 The Little Schemer 和 Project Euler 之外,还有什么学习 lisp 的建议吗?
这是我的代码:
(defun fib(i)
(if (= i 1) ;Could rewrite this as a case statement
1
(if (= i 2)
1
(+ (fib (- i 1)) (fib (- i 2))))))
(defun solve(i)
(let ((f (fib i))) ;Store result in local variable
(print f) ;For debugging
(if (< 4000000 f)
0 ;return
(if (= 0 (mod f 2))
(+ f (solve (+ i 1))) ;add number
(solve (+ i 1)))))) ;don't
(print (solve 1))