我刚刚开始使用LISP,我正在尝试编写一个函数来生成给定数字k的Lucas数列。最终,我想让这个函数返回到这个数字之前的所有Lucas数的列表,但现在我想得到Lucas数的实际计算。我遇到了一个我不知道如何克服的问题,我试图让函数在0处返回2,在1处返回1,依此类推,但我一直遇到以下错误:
我不知道为什么会这样。请在我的代码下面找到,任何反馈/帮助都将非常感谢,以及实现返回导致输入数字的所有Lucas数字列表的任何提示。提前感谢大家!
编辑: error message is >Error(s),warning(S):*- READ from#:对象不能以#开头)
代码为:
(defun lucas (k)
(if (= k 0))
2
(if (= k 1))
k
(+ (lucas (- k 1)) (lucas (- k 2)))))
(print (lucas 0))发布于 2020-10-29 10:30:20
发布的代码中有一个放错了位置的圆括号,以及一个过多的闭括号。正确的缩进显示了问题:
(defun lucas (k)
(if (= k 0))
2
(if (= k 1))
k
(+ (lucas (- k 1)) (lucas (- k 2))))在这里,在if语句中的测试之后没有要计算的表达式。相反,如果为(= k 0),则应计算2,否则应计算第二个if语句:
(defun lucas (k)
(if (= k 0)
2
(if (= k 1)
k
(+ (lucas (- k 1)) (lucas (- k 2))))))这里也可以用cond代替if:
(defun lucas-number (n)
(cond ((= n 0) 2)
((= n 1) 1)
(t
(+ (lucas-number (- n 1))
(lucas-number (- n 2))))))您可以很容易地使用loop将一系列的Lucas数字收集到一个系列中
CL-USER> (loop :for n :from 0 :to 10
:collect (lucas-number n))
(2 1 3 4 7 11 18 29 47 76 123)这将迭代从0到10 (包括10)的n,收集列表中相关的Lucas值。将此代码放入函数中非常容易;这里使用了:below,以便调用(lucas-series 10)生成前10个卢卡数,而不是n == 10之前的所有卢卡数(这将是前11个卢卡数):
(defun lucas-series (n)
(loop :for n :from 0 :below n
:collect (lucas-number n)))从REPL运行以下代码:
CL-USER> (lucas-series 10)
(2 1 3 4 7 11 18 29 47 76)https://stackoverflow.com/questions/64583808
复制相似问题