我编写了下面的代码,它可以工作,但很丑陋。其中最主要的问题是它太慢了 - 因为它一直在进行天真的递归。
当我用Python编写此程序时,我在计算时构建了一个列表,并且从不重新计算数字。我知道我也可以在这里这样做(以某种方式),但这似乎不符合Lisp和函数式编程的精神。在第三次尝试中,我达到了递归深度限制,并不得不重写我的代码以使用循环而不是递归。
所以我想问的问题是:
- 解决这个问题的“正确的Lisp方式”是什么?
- 如何调和递归和“只计算所有内容”的概念与计算所有内容的实际限制之间的差异?
- 除了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))