gpt4 book ai didi

LISP 程序需要不小的调整。

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

程序应该找到列表中某个符号之后的每个符号。该函数获取传入的参数。可以包含嵌套列表和符号的列表。该函数必须扫描整个列表并搜索给定符号并打印给定符号之后的符号。

例子:

(find-all 'a '((b a) ((c a b)))) --> (c b)
(find-all 'a '(b (a a) c)) --> (a c)
(find-all 'a '(b d c e)) --> nil

到目前为止我的代码:

(defun find-all (a list)
(if (consp list)
(if (consp (car list))
(find-all a (car list))
(if (eq a (car list))
(cons (car(cdr list)) (find-all a(cdr list)))
(find-all a(cdr list))))))

此代码有效,除非它查找的符号是列表中的最后一个原子。它在这些测试用例中失败了:

 (find-all 'a '((b a) ((c a b)))) --> (c b)
(find-all 'a '(b (a a) c)) --> (a c)

但在这些情况下工作正常:

(find-all 'a '(b a c a e)) --> (c e)

问题可能出在我的 cons 语句上,我无法解决这个问题。

最佳答案

我认为您的代码不正确。首先,它没有正确缩进,这使得它难以阅读。正确的缩进应该是:

(defun find-all (a list)
(if (consp list)
(if (consp (car list))
(find-all a (car list))
(if (eq a (car list)) ; if properly intended here
(cons (car(cdr list)) (find-all a(cdr list)))
(find-all a(cdr list)))))))))

即使在那之后我也无法理解您的逻辑。例如,当某事是缺点时,您应该同时处理 carcdr,但您没有这样做。我没有完成调试过程,但您应该完成。


相反,我想向您展示另一种选择。我建议将问题分为两部分:

扁平化列表

由于我们从嵌套列表开始但以扁平列表结束,因此先扁平化列表会更容易。这是一个经典的展平函数:

(defun flatten (sxp)
(labels
((sub (sxp res)
(cond
((null sxp) res)
((consp sxp) (sub (car sxp) (sub (cdr sxp) res)))
(t (cons sxp res)))))
(sub sxp nil)))

处理平面列表

现在,有了一个平面列表,其余的就变得很明显了,使用 member 函数(并调用我的函数 find-from 来将它与你在 REPL 中的函数区分开来) :

(defun find-from (a lst)
(labels
((sub (lst)
(when lst
(let ((rst (cdr (member a lst))))
(when rst
(cons (car rst) (sub rst)))))))
(sub (flatten lst))))

测试

? (find-from 'a '((b a) ((c a b))))
(C B)
? (find-from 'a '(b (a a) c))
(A C)
? (find-from 'a '(b d c e))
NIL
? (find-from 'a '(b a c a e))
(C E)

关于LISP 程序需要不小的调整。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26703799/

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