Lisp-迭代地在列表中添加数字

时间:2018-11-05 23:38:57

标签: common-lisp

我想创建一个包含n个佩尔编号的列表。到目前为止,我已经创建了所有内容并且可以正常使用,但是我无法找到一种打印数字列表的方法。这是我的代码:

(defun pell (n)
  (cond 
  ( (= n 0) 0)
  ( (= n 1) 1)
  ( (= n 2) 2)
   (t (+ (* 2 (pell (- n 1))) (pell (- n 2)))))

    (loop for i from 1 to n doing
    (list (pell i))))

不认为这是正确的,我想念什么?

2 个答案:

答案 0 :(得分:2)

您需要实际打印列表,或者,如果在REPL上进行测试,则将其返回,以便REPL打印它。

在REPL上,您可以将值收集到一个列表中,然后让REPL打印它:

> (loop :for i :below n
        :collect (pell i))
⇒ (0 1 2 5 12 29)

打印到标准输出:

(loop :for i :below n
      :do (print (pell i)))

请注意,Lisp中普遍接受的格式如下(请参见http://gigamonkeys.com/book/syntax-and-semantics.html#formatting-lisp-code):

(defun pell (n)
  (cond ((= n 0) 0)
        ((= n 1) 1)
        ((= n 2) 2)
        (t (+ (* 2 (pell (- n 1)))
              (pell (- n 2))))))

在函数定义中,您还缺少一个右括号,并且调用它的循环太多。您不想在该循环中进行递归调用,对吗?

答案 1 :(得分:1)

这与斐波那契数列有关,就像所有类似的序列一样,您可以通过将所需的最后n个数字保持循环来进行迭代。

(defun pell (n) 
  (loop :for cnt :below n
        :for a := 0 :then b 
        :for b := 1 :then c 
        :for c := 2 :then (+ (* 2 b) a) 
        :collect a))