这篇文章如何为给定列表创建所有子列表的列表?
How does this piece create list of all sublists for a given list?
有人可以解释一下下面的代码吗?
我了解每一小块的作用,但似乎无法理解它们是如何协同工作的
该函数正在获取一个列表,例如:
(1 2 (3 (4 5) (6 7)) 8 (9 10))
它有 5 个子列表,它 return 是所有子列表的列表:
((1 2 (3 (4 5) (6 7)) 8 (9 10)) (3 (4 5) (6 7)) (4 5) (6 7) (9 10))
密码是:
(defun all_sublists (l)
(cond
((atom l) nil)
(T (apply 'append (list l) (mapcar 'all_sublists l)))
)
)
我知道第一个 cond 说 if l is an atom return nil,但是你能解释一下第二行是什么吗?为什么我理解的T是True,能不能简单解释一下?
all_sublists
是一个典型的递归函数。在分析这样的递归函数时,我们可以这样进行:
在查看函数的实现之前,我们假设它是正确的。那么这个有什么作用呢?我们被告知它需要一个包含子列表的列表,并且 return 是一个新列表,其中包含原始列表及其所有子列表的串联(递归地,因此如果内部子列表包含其他子列表,则这些子列表是 return与内部子列表一起编辑)。所以我们假设这是真的,然后看函数。
第一行简单易懂:在空列表的情况下,即没有元素的列表,既没有原子也没有子列表,我们returnnil
这实际上是列表本身,这符合函数的定义。
要理解第二行,我们从内部表达式开始。那么,(mapcar 'all_sublists l)
是什么意思? mapcar
returns 一个列表,该列表是通过将某个函数应用于列表的所有元素的结果串联起来得到的。这里我们将 all_sublists
应用于 l
的所有元素,因此我们 return 一个包含所有此类应用结果的列表:换句话说,将 all_sublists
应用于的结果l
的每个元素。当一个元素是一个原子时,它 returns nil
,而如果一个元素是一个列表,它 returns 是通过连接该元素及其所有子列表得到的列表(我们知道已经 all_sublists
returns!)。所以包含所有这些结果的列表是 returned。现在看看外部表达式:(apply 'append (list l) the-result-of-mapcar)
。 apply
将函数(在本例中为 append
)应用于参数列表。因此,在这种情况下,我们将原始列表 l
、the-result-of-mapcar
附加到包含作为唯一元素的列表。所以我们得到一个由 l
及其所有子列表组成的列表,由函数递归生成。
最后一点:这在某种程度上似乎是“神奇的”,或者也许是“荒谬的”。如果您最初没有完全理解它,请不要气馁。我们都有同样的感觉。但是如果你坚持去理解这种递归,你最终会成功的!
有人可以解释一下下面的代码吗? 我了解每一小块的作用,但似乎无法理解它们是如何协同工作的 该函数正在获取一个列表,例如:
(1 2 (3 (4 5) (6 7)) 8 (9 10))
它有 5 个子列表,它 return 是所有子列表的列表:
((1 2 (3 (4 5) (6 7)) 8 (9 10)) (3 (4 5) (6 7)) (4 5) (6 7) (9 10))
密码是:
(defun all_sublists (l)
(cond
((atom l) nil)
(T (apply 'append (list l) (mapcar 'all_sublists l)))
)
)
我知道第一个 cond 说 if l is an atom return nil,但是你能解释一下第二行是什么吗?为什么我理解的T是True,能不能简单解释一下?
all_sublists
是一个典型的递归函数。在分析这样的递归函数时,我们可以这样进行:
在查看函数的实现之前,我们假设它是正确的。那么这个有什么作用呢?我们被告知它需要一个包含子列表的列表,并且 return 是一个新列表,其中包含原始列表及其所有子列表的串联(递归地,因此如果内部子列表包含其他子列表,则这些子列表是 return与内部子列表一起编辑)。所以我们假设这是真的,然后看函数。
第一行简单易懂:在空列表的情况下,即没有元素的列表,既没有原子也没有子列表,我们return
nil
这实际上是列表本身,这符合函数的定义。要理解第二行,我们从内部表达式开始。那么,
(mapcar 'all_sublists l)
是什么意思?mapcar
returns 一个列表,该列表是通过将某个函数应用于列表的所有元素的结果串联起来得到的。这里我们将all_sublists
应用于l
的所有元素,因此我们 return 一个包含所有此类应用结果的列表:换句话说,将all_sublists
应用于的结果l
的每个元素。当一个元素是一个原子时,它 returnsnil
,而如果一个元素是一个列表,它 returns 是通过连接该元素及其所有子列表得到的列表(我们知道已经all_sublists
returns!)。所以包含所有这些结果的列表是 returned。现在看看外部表达式:(apply 'append (list l) the-result-of-mapcar)
。apply
将函数(在本例中为append
)应用于参数列表。因此,在这种情况下,我们将原始列表l
、the-result-of-mapcar
附加到包含作为唯一元素的列表。所以我们得到一个由l
及其所有子列表组成的列表,由函数递归生成。
最后一点:这在某种程度上似乎是“神奇的”,或者也许是“荒谬的”。如果您最初没有完全理解它,请不要气馁。我们都有同样的感觉。但是如果你坚持去理解这种递归,你最终会成功的!