在 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)