gpt4 book ai didi

lisp - ' ('(LIST) ' 无 'NIL) should be a lambda expression in (hanoi(' ('(list)' ()'())))

转载 作者:太空宇宙 更新时间:2023-11-03 19:03:29 25 4
gpt4 key购买 nike

我正在尝试实现 Towers of Hanoi .我还没有在我的递归调用之间打印出任何东西,但我一直收到错误提示

'('(LIST) 'NIL 'NIL) should be a lambda expression

我读到发生这种情况的原因是括号有问题,但我似乎无法找到我的问题所在。当我尝试调用 hanoi 函数时,我认为它发生在 pass-list 函数中。我的代码:

(defun pass-list(list)
(hanoi('('(list)'()'())))
)

(defun hanoi ('('(1) '(2) '(3)))

(hanoi '('(cdr 1) '(cons(car 1) 2) '(3)))

(hanoi '('(cons(car 3)1) '(2)'(cdr 3)))
)

最佳答案

这段代码有很多语法问题;到处都是错误的引号,看起来你正在尝试使用数字作为变量,这是行不通的。您提到的特定错误消息的来源来自

(hanoi('('(list)'()'())))

首先,了解 quote 'x'(a b c) 中的 s 是 (quote x)(quote (a b c)),而 (quote anything) 是获取 anything 的语法,无需评估 anything。所以 '(1 2 3) 给你列表 (1 2 3),而 '1 给你 1quote 只是一个符号,可以出现在其他列表中,所以 '('(list)'()'()) 相同(quote ((quote (list)) (quote ()) (quote ()))) 计算结果为列表 ((quote (list)) (quote ()) (quote ()) )。由于 () 也可以写成 nil(或 NIL),所以最后一个与 ('(list) 'NIL '无)。在 Common Lisp 中,函数调用看起来像

(function arg1 arg2 ...)

其中每个 argi 是一种形式,function 是一个符号(例如,listhanoi , car) 或列表,在这种情况下它必须是 lambda 表达式,例如 (lambda (x) (+ x x)) .所以,在你的行中

(hanoi('('(list)'()'())))

我们有一个函数调用。 functionhanoiarg1('('(list)'()'())) .但是如何评估这个 arg1 呢?好吧,它是一个列表,这意味着它是一个函数应用程序。 function 部分是什么?这是

'('(list)'()'())

相同
'('(list 'NIL 'NIL))

但正如我刚才所说,唯一可以作为 函数 的列表是 lambda 表达式。这显然不是 lambda 表达式,所以您会得到您所看到的错误。

我不能确定,但​​看起来您的目标类似于以下内容。标有 ** 的行有点问题,因为你用一些参数调用 hanoi ,当它返回时(如果它曾经返回;在我看来在这种情况下你会永远递归),你不会对结果做任何事情。它被忽略,然后您转到第三行。

(defun pass-list(list)
(hanoi (list list) '() '()))

(defun hanoi (a b c)
(hanoi (rest a) (cons (first a) b) c) ; **
(hanoi (cons (first c) a) b (rest c)))

如果 hanoi 应该采用单个列表作为参数,并且该列表应该包含三个列表(我不确定你为什么要那样做而不是 hanoi 只接受三个参数,但我想这是一个不同的问题),它很容易修改;只需要一个参数 abc 并从中提取第一个、第二个和第三个列表,然后在递归调用中将单个列表传递给 hanoi:

(defun hanoi (abc)
(let ((a (first abc))
(b (second abc))
(c (third abc)))
(hanoi (list (rest a) (cons (first a) b) c))
(hanoi (list (cons (first c) a) b (rest c)))))

我实际上可能会使用 destructuring-bind这里是为了简化从 abc 中获取 abc 的过程:

(defun hanoi (abc)
(destructuring-bind (a b c) abc
(hanoi (list (rest a) (cons (first a) b) c))
(hanoi (list (cons (first c) a) b (rest c)))))

关于lisp - ' ('(LIST) ' 无 'NIL) should be a lambda expression in (hanoi(' ('(list)' ()'()))),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19897379/

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