LISP中的连接子列表位于一个大列表中

时间:2014-03-18 14:01:02

标签: recursion lisp

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

(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) ) ) ) )

1 个答案:

答案 0 :(得分:1)

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

您的t案例几乎是正确的,但您实际上已将其彻底解决 - 应该是

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

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

listp案件看起来像是一种类似“内外”的形式。
除了令人费解的y之外,你有所有正确的位但排序错误,除了它需要两次Func1次调用 - 一次用于car而另一次用于cdr

在这种情况下,我将把这些位的重新排列作为练习。