Recursion LISP中的连接子列表位于一个大列表中
我是lisp新手,我正在尝试编写一个函数,该函数将包含子列表(如(12(3(4))5)的列表转换为这样的列表(1 2 3 4 5)。问题是,我不知道如何在一个条件下下下两个订单。例如,这里是我的代码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) ) ) ) ) 我知道我需要改变第二个条件
(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)))?非常感谢你的帮助。