【发布时间】:2010-10-12 06:14:16
【问题描述】:
我想尝试学习 Lisp,但很快就放弃了。我想我会再试一次。我正在查看 Problem 2 on Project Euler - 查找所有低于 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))
【问题讨论】:
-
请,在编写 lisp 代码时不要乱扔括号。请参阅gigamonkeys.com/book/syntax-and-semantics.html 的最后一段“格式化 Lisp 代码”以获取指南。
-
我部分不同意。 “Lonely-parens” 是不好的风格,但如果您使用它们的原因是为了帮助习惯使用 Lisp 编程,那么您将获得更多的力量。只要记住最终要塑造自己的风格。
-
@Tom Ritter 为什么不使用 paredit 模式。它摇摆不定。试一试:)
标签: lisp common-lisp fibonacci