在 Lisp 中制作 Lucas 系列
Producing a Lucas Series in Lisp
我刚开始摆弄 LISP,我正在尝试编写一个函数来生成给定数字 k 的卢卡斯序列。最终,我还想将此 return 列为导致此数字的所有卢卡斯数字的列表,但现在我想对卢卡斯数字进行实际计算。我遇到了一个我不知道如何克服的问题,我试图让函数 return 2 at 0, 1 at 1 等等,但是我让 运行 进入以下错误:
我不知道这是为什么。请在我的代码下方找到任何 feedback/help 以及实现 returning 导致输入数字的所有卢卡斯数字列表的功能的任何提示,我们将不胜感激。提前谢谢大家!
编辑:
错误消息是 >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))
发布的代码中括号错位,右括号也太多。正确的缩进显示问题:
(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
:
轻松地将一系列卢卡斯数字收集成一个系列
CL-USER> (loop :for n :from 0 :to 10
:collect (lucas-number n))
(2 1 3 4 7 11 18 29 47 76 123)
这会迭代 n
从 0 到 10(包括 10),在列表中收集相关的卢卡斯号码。将这段代码放在一个函数中很容易;这里使用 :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)
我刚开始摆弄 LISP,我正在尝试编写一个函数来生成给定数字 k 的卢卡斯序列。最终,我还想将此 return 列为导致此数字的所有卢卡斯数字的列表,但现在我想对卢卡斯数字进行实际计算。我遇到了一个我不知道如何克服的问题,我试图让函数 return 2 at 0, 1 at 1 等等,但是我让 运行 进入以下错误:
我不知道这是为什么。请在我的代码下方找到任何 feedback/help 以及实现 returning 导致输入数字的所有卢卡斯数字列表的功能的任何提示,我们将不胜感激。提前谢谢大家!
编辑: 错误消息是 >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))
发布的代码中括号错位,右括号也太多。正确的缩进显示问题:
(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
:
CL-USER> (loop :for n :from 0 :to 10
:collect (lucas-number n))
(2 1 3 4 7 11 18 29 47 76 123)
这会迭代 n
从 0 到 10(包括 10),在列表中收集相关的卢卡斯号码。将这段代码放在一个函数中很容易;这里使用 :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)