【问题标题】:Lisp: pell numbersLisp:拼写数字
【发布时间】:2021-03-20 14:16:52
【问题描述】:

我必须编写一个递归 Lisp 函数来打印拼写号而不是最后一个数字。例如(pellnumbers 6) 应该返回一个列表(0 1 2 5 12 29 70)

这是我的功能

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

但它只打印最终数字,有人可以帮我吗?它需要是递归的。

【问题讨论】:

  • 你说函数应该打印一些东西,但是你说它应该返回一个列表。到目前为止,您的函数什么也没打印(代码中没有类似打印的语句),但它返回一个结果,一个数字。您的讲师可能已经告诉您如何创建列表并将项目添加到列表中?
  • 当我这样做时 (print(pellnumbers 6)) 我得到 70 而不是列表,因为我没有执行任何列表操作,我尝试创建一个空列表,然后将空列表添加到使用 cons 的递归调用,但它不起作用
  • 这是我第一次使用lisp所以我不是很熟悉
  • 这是一本优秀的 Lisp 介绍书:cs.cmu.edu/~dst/LispBook/book.pdf。我通常会建议阅读它,而不是使用 Stackoverflow 来获取为您编写的部分代码。

标签: lisp


【解决方案1】:

因此,首先您会理解为什么反向生成这样的列表几乎总是更好。这是一个明显的方法:

(defun pell (n)
  ;; the n'th pell number
  (cond
   ((= n 0) 0)
   ((= n 1) 1)
   ((> n 1) (+ (* 2 (pell (- n 1)))
               (pell (- n 2))))
   (t (error "horror death crust"))))

现在

(defun pell-list (n)
  (if (< n 0)
      '()
    (cons (pell n) (pell-list (1- n)))))

问题:为什么这种方法很糟糕(尝试计算(pell-list 50))?

这是另一个做同样事情的函数:

(defun pell-numbers (n)
  (cond
   ((= n 0) '(0))
   ((= n 1) '(1 0))
   ((> n 1)
    (let ((pn-1 (pell-numbers (1- n))))
      (cons (+ (* 2 (first pn-1))
               (second pn-1))
            pn-1)))
   (t (error "bad mutant death"))))

为什么这个那么好多了?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-06
    • 2011-04-18
    • 2019-09-12
    • 1970-01-01
    • 1970-01-01
    • 2022-12-07
    • 2014-07-17
    • 1970-01-01
    相关资源
    最近更新 更多