recursion - 如何从 lisp 的嵌套列表中删除长度为 1 的列表?
问题描述
我有一个嵌套列表 (1 (4 (5) 3) 9 10),我想删除长度为 1 的列表,因此结果将是 (1 (4 3) 9 10)。这是我迄今为止尝试过的,它不会删除 (5) 并返回原始列表。
(defun remove (l)
(cond
((null l) nil)
((and (listp (car l)) (= (length l) 1)) (remove (cdr l)))
((atom (car l)) (cons (car l) (remove (cdr l))))
(T (cons (remove (car l)) (remove (cdr l))))
))
解决方案
两件事:首先,remove
是包 CL 中的预定义函数,所以我强烈建议使用不同的名称,比如说my-remove
. 其次,您正在测试长度l
而不是 sublist (car l)
,这是您想要消除的。正确的形式是:
(defun my-remove (l)
(cond
((null l) nil)
((and (listp (car l)) (= (length (car l)) 1)) (my-remove (cdr l)))
((atom (car l)) (cons (car l) (my-remove (cdr l))))
(T (cons (my-remove (car l)) (my-remove (cdr l))))
))
推荐阅读
- c# - C# 文本框中的文本框数组以构建数独板
- mysql - 在 Windows Docker 映像上安装 MySQL
- assembly - 0x400 在汇编中是什么意思?
- javascript - 用嵌套对象内的新键值对替换键值对
- c# - 带有 CRUD 的 FormatException 索引参数
- javascript - 为什么 for in 和 for of 循环不能正确显示复杂类型?
- android - Android Studio 模拟器已终止错误
- c++ - 在 (Neo)vim 中调试 C++
- c++ - 我们可以在类的方法中访问另一个对象的私有成员吗?
- javascript - 为什么在对具有全局范围的变量执行非声明性破坏赋值时会引发 Node/Jest 运行时语法错误?