gpt4 book ai didi

list - 将项目替换为列表中的每个匹配项

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

我刚刚开始学习 Lisp。我的问题是每次出现在列表中时我都试图替换它。我必须使用递归并且没有任何循环来做到这一点。该函数以 (subste x y L) 开头。

例子是:

(subste 7 t '(it is 7)) → (IT IS T)
(subste 7 nil '(7 is not to (7))) → (NIL IS not TO (NIL))
(subste 7 nil '(5 is not (22))) → (5 is not (22))

这是我目前所要做的:

(defun subste (x y L)
(cond ((null L) nil)
((not (= (car L) x))
subste (x y (cdr L)))
((= (car L) x)
(let L 'y))))

我已经多次运行这个程序并多次调整它,但考虑到错误消息提供的信息很少并且才刚刚开始学习 Lisp,所以运气不佳。谢谢。

最佳答案

SUBST已经实现了您想要的行为。您似乎只是希望新旧元素的顺序不同,所以一个简单的包装器就可以:

(defun subste (x y l)
(subst y x l))

如果你想自己实现,下面是一个简单的版本。注意不同的分支:

  • 递归树总是涉及对树的第一个元素进行递归调用,对树的其余部分进行另一个元素的递归调用。
  • 在树的末尾返回 nil
  • 如果我们找到要替换的元素,我们会更改它。
  • 对于任何其他原子,我们不需要递归,我们只返回原子。

这里是例子:

(defun subste (x y l)
(cond ((null l) nil)
((eql l x) y)
((atom l) l)
(T (cons (subste x y (first l))
(subste x y (rest l))))))

此版本不完整:您无法替换非 eql 元素(如字符串或子列表)。您可以添加一个测试函数作为参数,而不是始终使用 EQL如果你愿意的话。

关于list - 将项目替换为列表中的每个匹配项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33029165/

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