recursion - LISP 中的连接子列表在一个大列表中

标签 recursion lisp

<分区>

我是 lisp 的新手,我正在尝试编写一个函数,将带有子列表(例如 (1 2 (3 (4)) 5) 的列表转换为这样的列表 (1 2 3 4 5 ).问题是,我不知道如何在一个条件下放置 2 个订单。例如这里是我的代码

(defun Func1 (x y)
(cond
((null x) y)
((listp (CAR x)) (Func1 (CDR x) (append y (CAR x) )) )
(T (Func1 (CDR x) (CONS (CAR x) y) ) ) ) )

好吧,我知道我需要更改第二个条件,所以如果 x 的第一个元素是一个列表,那么我将调用相同的函数,如 (Func1 (CAR x) y) 但如果我这样做,我会只获取子列表的项目,我将丢失列表的另一部分。所以基本上,我的问题是,我如何告诉 LISP 在完成这一行之后

 ((listp (CAR x)) (Func1 (CDR x) (append y (CAR x) )) )

它应该继续执行另一行

(T (Func1 (CDR x) (CONS (CAR x) y) ) ) ) )

最佳答案

我不明白为什么你的函数在重新排列一个列表时需要 2 个参数。

你的 t 案例几乎是正确的,但你实际上已经把它翻了个底朝天 - 它应该是

(cons (car x) (Func1 (cdr x)))

car 与输入相同的列表,cdr 是将 cdr 展平的结果输入的。

listp 案例看起来像是在遭受类似形式的“由内而外”。
除了莫名其妙的 y 你有所有正确的位但顺序错误,除了它需要两个 Func1 调用 - 一个用于 car和一个用于 cdr

在那种情况下,我将把位的重新排列留作练习。

关于recursion - LISP 中的连接子列表在一个大列表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22481672/

相关文章:

LISP - 将语法输入转换为字符串(语言理论)

list - 如何比较序言中的两个列表,如果第二个列表由列表一的所有其他元素组成,则返回 true?

Swift 递归函数,返回类型 Closure

scope - 了解 LISP 中的绑定(bind)变量和自由变量

macros - 如何在外部宏之前扩展内部宏?

lisp - 单引号字符串 checkin 列表

list - Lisp 反转所有连续的元素序列

function - 实现递归函数(阶乘)时出现堆栈溢出错误

python - 当调用递归函数对值进行排序时,它会漏掉一个。我该如何解决?

javascript - 递归javascript函数不会返回父调用数据?