【问题标题】:Connection sub-lists in LISP in one big list [duplicate]LISP 中的连接子列表在一个大列表中[重复]
【发布时间】:2014-03-18 23:19:56
【问题描述】:

我是 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) ) ) ) )

【问题讨论】:

  • 这通常称为扁平化列表,有lots of questions on Stack Overflow about flattening lists。如果您浏览他们的代码,您可能会找到您需要的结构。但是,这个问题中的代码格式很难说出您尝试编写的内容,并且不太清楚您在问什么。
  • 接受(1 2 (3 (4)) 5) 并返回(1 2 3 4 5) 的函数几乎可以肯定是 one 参数的函数(要展平的列表),但您正在编写一个函数两个参数,xyxy 应该是什么(命名不清楚)? y 应该是一种累加器,因此您最初会调用类似 (func1 (1 2 (3 (4)) 5)) 的东西。如果是这种情况,我们真的需要更多地描述您正在尝试编写的内容,以及哪些内容不起作用。
  • 我使用 y 作为一个空列表,我将从中返回结果。

标签: recursion lisp


【解决方案1】:

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

您的t 案例几乎是正确的,但您实际上已经完全颠倒了——它应该是

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

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

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

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

【讨论】:

  • 是 ((listp (CAR x)) (append (Func1 (CAR x)) (Func1 (CDR x)) ) ) 吗?非常感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2015-09-24
  • 1970-01-01
  • 1970-01-01
  • 2019-05-25
  • 2013-06-13
  • 2020-05-29
  • 2013-01-30
  • 1970-01-01
相关资源
最近更新 更多