gpt4 book ai didi

recursion - Lisp 递归函数在第一次调用时缺少基本情况

转载 作者:太空宇宙 更新时间:2023-11-03 18:50:55 27 4
gpt4 key购买 nike

我昨天开始使用 lisp 编程,所以如果我犯了一些真正的新手错误,请原谅。我正在尝试创建一个使用钟形三角形计算铃号的函数,但我的递归三角形函数无法正常工作。我还确定如果我的递归三角函数正常工作,我的递归钟函数也会以某种方式被破坏。

当我测试我的三角函数时,我得到了输出:

(defun bell(l n)
(if(< n 1)(list 1))
(if (= n 1)(last l))
(bell (triangle (reverse l) (last l) (list-length l)) (- n 1))
)
(defun triangle(pL nL i)
(if(<= i 0)
(write "equals zero!")
(reverse nL)
)
(triangle pL (append (list (+ (nth i pL) (nth i nL))) nL) (- i 1))
)
(write (triangle '(1) '(1) 0))


=>


"equals zero!""equals zero!"
*** - NTH: -1 is not a non-negative integer

出于某种原因,它会打印我的调试代码两次,即使该函数在第一次调用时应该满足我的基本情况。

最佳答案

For some reason, it is printing my debug code twice even though the function should be meeting my base case on the first call.

它被打印了两次,因为 if 没有按照您认为的那样去做。第一个 if 测试为 true,因此 equals zero! 被打印出来。之后,调用三角函数的递归调用。测试再次为真 (-1 <= 0),因此 equals zero! 再次打印。最后,你会得到一个错误,因为 nthcdr 函数是用 -1 调用的。我强烈推荐你一个好的 lisp 调试器。来自 Lispworks 的那个非常好。

老实说,我不明白你试图用你的代码实现什么的逻辑。所以我写了我的:

(defun generate-level (l &optional (result))
"given a list l that represents a triangle level, it generates the next level"
(if (null l) result
(if (null result)
(generate-level l (list (car (last l))))
(generate-level (cdr l) (append result
(list (+ (car l)
(car (last result)))))))))


(defun bell (levels &optional (l))
"generate a bell triangle with the number of labels given by the first parameter"
(unless (zerop levels)
(let ((to-print (if (null l) (list 1) (generate-level l))))
(print to-print)
(bell (1- levels) to-print))))

理解实现的事情:

  1. &optional (parameter):该参数可选,默认为nil。
  2. append 连接两个列表。我用它来插入列表的后面。
  3. let ((to-print x)) 创建一个名为 to-print 的新变量绑定(bind)(局部变量)并初始化为 x .
  4. 我差点忘了提到 if 在 common lisp 中是如何工作的:(if (= x 1) y z)表示如果x等于1则返回y,否则返回z .

现在,如果您调用该函数来创建一个 7 级的钟形三角形:

CL-USER 9 > (bell 7)

(1)
(1 2)
(2 3 5)
(5 7 10 15)
(15 20 27 37 52)
(52 67 87 114 151 203)
(203 255 322 409 523 674 877)
NIL

用适当的填充打印它会更好,像这样:

                    1
1 2
2 3 5
5 7 10 15
15 20 27 37 52
52 67 87 114 151 203
203 255 322 409 523 674 877

但我将其作为练习留给了读者。

关于recursion - Lisp 递归函数在第一次调用时缺少基本情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36601294/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com