Data structures 自顶向下与自下而上递归数据定义?

Data structures 自顶向下与自下而上递归数据定义?,data-structures,recursion,Data Structures,Recursion,在阅读《编程语言要点》时,我遇到了整数列表的自上而下和自下而上的定义,而我理解这些定义的含义。但我无法理解自上而下和自下而上方法的细节。我如何看待一个定义并说它是自上而下还是自下而上 自上而下 方案列表是一个整数列表 当且仅当 它是空列表,或者 它是一对car为整数且cdr为整数列表的组合 自下而上 Int的集合列表是最小的 满足以下两个属性的方案列表集: ()∈ Int的列表,以及 如果n∈ Int和l∈ Int的列表,然后(n.l)∈ 整型列表 这两个概念与归纳和递归的概念有关。这两个概念都

在阅读《编程语言要点》时,我遇到了整数列表的自上而下和自下而上的定义,而我理解这些定义的含义。但我无法理解自上而下和自下而上方法的细节。我如何看待一个定义并说它是自上而下还是自下而上

自上而下 方案列表是一个整数列表 当且仅当

  • 它是空列表,或者

  • 它是一对car为整数且cdr为整数列表的组合

  • 自下而上 Int的集合列表是最小的 满足以下两个属性的方案列表集:

  • ()∈ Int的列表,以及

  • 如果n∈ Int和l∈ Int的列表,然后(n.l)∈ 整型列表


  • 这两个概念与归纳和递归的概念有关。这两个概念都是描述无限大对象族的方法,尽管它们的方法不同

    当你自下而上定义某件事时,你是在归纳地定义它。我们的想法是从一组固定元素开始,然后将这些元素组合成新元素。在上面的自底向上定义中,最初所有整数列表集中唯一的元素是空列表。您还有一个规则,它允许您在整数列表集中获取一个列表,并通过在一个整数前面加上前缀将其扩大一步

    当你自上而下定义某个东西时,你是在递归地定义它。这个想法是,你从一些非常大的对象家族开始——在本例中,是每个可能的列表——然后描述那些仅由整数组成的列表。通常,通过取现有对象并排除不匹配的对象来定义同传定义的元素。例如,在整数列表的示例中,您定义某个对象是否是整数列表,方法是获取您喜欢的任何列表,然后验证如果您不断地分解它,最终会在一些您知道是整数列表的对象(在本例中,仅是空列表)处找到它

    这两种形式实际上是等价的,但它们的用途不同。归纳法尝试构建整个有效对象集,然后定义与描述匹配的所有对象。递归最初并没有定义任何东西,但随后通过将对象分开并验证它来检查您拥有的任何对象是否符合某些条件。由于这两者在数学上的神奇定义,任何归纳定义都可以转化为递归定义,反之亦然(假设你所说的所有对象都是有限的)


    编辑:如果你真的想体验一次有趣的旅程,你可能会想看看相关的概念。这些是归纳和递归的数学对偶,提供了一种关于如何定义数据结构的完全不同的思考方式。特别是,它们允许无限大的数据结构,这通常不能归纳定义。有趣的是,在数据方面,共归纳、共递归、归纳和递归之间存在着联系。您可以将数据结构的归纳定义视为满足某些属性的最小集合,而共归纳定义是具有该属性的最大集合。真的很酷

    感谢这意味着在自上而下的方法中,我们从一个数据结构开始,假设它是一个整数列表,然后将它一个接一个地撕开,直到我们得到一个空列表,它被隐式定义为整数列表。相反,在自下而上的方法中,我们从一个空的开始,假设它属于整数列表,然后将perpending整数保留在空列表的前面,直到我们没有任何要添加的内容。再次感谢。对我来说,共归纳和共递归是一个新奇的概念。关于共归纳和共递归的链接不再有效。这个链接似乎是关于共归纳和共递归的一个很好的资源。这就是我要说的:根本不存在“自下而上的递归”。自下而上算法根本不进行递归函数调用。