【问题标题】:Lisp - adding numbers in a list iterativelyLisp - 在列表中迭代地添加数字
【发布时间】:2018-11-05 23:38:56
【问题描述】:

我想创建一个列表,其中包含 n 的 Pell 编号。到目前为止,我创建了所有内容并且它可以正常工作,但我无法找到打印数字列表的方法。这是我的代码:

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

不认为这是正确的,我错过了什么?

【问题讨论】:

    标签: common-lisp


    【解决方案1】:

    您需要实际打印该列表,或者,如果在 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))))))
    

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

    【讨论】:

    • 感谢您的回答,基本上,我在函数末尾的 cond 之后添加了您建议的循环并调用了(pell 6),但它仍然打印此错误:*** - *: (NIL (NIL)) is not a number
    • 没关系,我刚刚修复了我的错误,它运行良好,+1 用于解释!
    【解决方案2】:

    这与斐波那契数列有关,并且与所有类似的数列一样,您可以通过将所需的最后 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))
    

    【讨论】:

      猜你喜欢
      • 2010-09-07
      • 2015-09-06
      • 2018-12-03
      • 2014-10-28
      • 2015-05-14
      • 1970-01-01
      • 2020-08-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多