lisp - Common LISP:制作你自己的联合函数
问题描述
我正在尝试创建自己的联合功能并意识到我多么不喜欢 LISP。目标是给函数两个列表,它将返回两者的集合理论并集。我尝试的解决方案变得越来越复杂,结果相同:NIL。无论我做什么,我都无法改变结果。
我正在考虑在下面的“removeDuplicates”函数中建立一个单独的列表,但后来我想知道如何通过递归返回它。我认为发生的事情是我的“removeDuplicates”函数最终返回一个空列表(如预期的那样),但是当递归展开(开始返回堆栈的值)时,堆栈的每一级都会返回一个空列表,但我可能是错的。我一直无法详细理解递归。代码如下。
(defun rember (A LAT)
(cond
((null LAT) ())
((EQ (car LAT) A) (cdr LAT))
(T (cons (car LAT)(rember A (cdr LAT))))
)
)
(defun my_member (A LAT)
(cond
((null LAT) nil)
((EQ (car LAT) A) T)
(T (my_member A (cdr LAT)))
)
)
(defun removeDuplicates (L)
(cond
((null L) '())
((my_member (car L) (cdr L)) (rember (car L) L) (removeDuplicates (cdr L)))
(T (removeDuplicates (cdr L)))
)
)
(defun my_union (A B)
(setq together(append A B))
(removeDuplicates together)
)
我知道大多数人不喜欢这种 LISP 代码格式,但我更喜欢它。与将所有右括号放在一起放在函数和条件块的末尾相比,它可以让我看到括号如何排列更好。
(my_union '(a b) '(b c))
例如,如果我运行,结果为 NIL。
解决方案
当您removeDuplicates
在最后一个条件下递归调用时,您不会将结果与car
列表的 组合,因此您将丢弃该元素。
您也没有使用rember
.
(defun removeDuplicates (L)
(cond
((null L) '())
((my_member (car L) (cdr L))
(cons (car L)
(removeDuplicates
(rember (car L) (cdr L))
))
)
(T (cons (car L) (removeDuplicates (cdr L))))
)
)
推荐阅读
- python - 如何修复游戏功能?
- gtk3 - GTK3:一个应用程序中的多个事件循环
- python - 为什么while循环会创建无限循环?猜测 1 和 100
- r - 应用 ':=' 后,Data.table 没有明显返回
- php - PHP 使用变量访问嵌套对象属性
- python - 用指定半径的圆形点填充经度/纬度地图的最有效方法是什么?
- c# - Media.Plugin 仅适用于 Google Photo
- python - 组合不同的对象包含图表和数据框(表格)和段落(降价)到单个 html 报告中
- python - 在 keras >2.0 中使用什么来代替 mode='mul' 的合并?
- material-ui - 带有微调器的 MaterialUI CardMedia 图像