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

Recursion LISP中的连接子列表位于一个大列表中,recursion,lisp,Recursion,Lisp,我是lisp新手,我正在尝试编写一个函数,该函数将包含子列表(如(12(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) ) ) ) ) 我知道我需要改变第二个条件

我是lisp新手,我正在尝试编写一个函数,该函数将包含子列表(如(12(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) ) ) ) )

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

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

(cons (car x) (Func1 (cdr x)))
也就是说,列表中的
car
与输入中的相同,并且
cdr
是平坦化输入的
cdr
的结果

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


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

这通常被称为平铺列表,并且有。如果你浏览他们的代码,你可能会找到你需要的结构。但是,这个问题中的代码格式很难告诉您试图写什么,而且您的问题也不太清楚。一个接受
(12(3(4))5
并返回
(1 2 3 4 5)
的函数几乎肯定是一个单参数函数(要展平的列表),但是您正在编写一个包含两个参数的函数,
x
y
x
y
应该是什么(命名不清楚)?
y
应该是一种累加器,因此您最初会调用类似于
(func1(12(3(4))5)的东西
。如果是这样的话,我们真的需要更多地描述您试图编写的内容,以及哪些内容不起作用。我使用y作为空列表,从中返回结果。它是((listp(CAR x))(append(Func1(CAR x))(Func1(CDR x)))?非常感谢你的帮助。