自上而下与自下而上的递归数据定义?

Posted

技术标签:

【中文标题】自上而下与自下而上的递归数据定义?【英文标题】:Top down vs bottom up recursive data definition? 【发布时间】:2011-06-23 19:45:06 【问题描述】:

在阅读“编程语言精要”时,我遇到了整数列表的自上而下和自下而上的定义。虽然我理解这些定义的含义。但我无法理解自上而下与自下而上方法的细节。如何查看定义并说它是自上而下还是自下而上?

自上而下 一个 Scheme 列表是一个整数列表 当且仅当有一个

    它是空列表,或者

    它是一对,car 是整数,cdr 是整数列表。

自下而上 集合 List-of-Int 是最小的 一组满足以下两个属性的 Scheme 列表:

    () ∈ List-of-Int,并且

    如果 n ∈ Int 且 l ∈ List-of-Int,则 (n . l) ∈ List-of-Int。

【问题讨论】:

【参考方案1】:

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

当您自下而上定义某些东西时,您是在归纳地定义它。这个想法是您从一组固定元素开始,并以一种将这些元素组合为新元素的方式开始。在上面的自下而上定义中,最初在所有整数列表的集合中唯一的元素是空列表。您还有一条规则,允许您从一组整数列表中获取一个列表,并通过在前面添加一个整数将其扩展为更大的值。

当您自顶向下定义某事物时,您是在递归地定义它。这个想法是你从一些非常大的对象系列开始——在这种情况下,每个可能的列表——然后只描述那些仅由整数组成的列表。通常,通过提取现有对象并排除不匹配的对象来定义联归纳定义的元素。例如,在整数列表的示例中,您可以通过获取任何您喜欢的列表来定义某物是否是整数列表,然后验证如果您不断地分解它,您最终会在某些对象上触底你知道是整数列表(在这种情况下,只是空列表)。

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

编辑:如果您真的想要玩得开心,您可能想查看coinduction and corecursion 的相关概念。这些是归纳和递归的数学对偶,并提供了一种完全不同的思考如何定义数据结构的方式。特别是,它们允许无限大的数据结构,通常不能以归纳方式定义。有趣的是,在fixed points 方面,共归纳、核心递归、归纳和递归之间存在联系。您可以将数据结构的归纳定义视为满足某些属性的最小集,而协约定义是具有该属性的最大集。真的很酷!

【讨论】:

谢谢,这意味着在自上而下的方法中,我们从一个数据结构开始,假设它是一个整数列表,然后将其逐个撕开,直到我们到达空列表,该列表被隐式定义为整数。相反,在自下而上的方法中,我们从一个空开始,假设它属于整数列表,然后继续在空列表前面添加整数,直到我们没有任何要添加的内容。 再次感谢。 Coinduction 和 corecursion 对我来说是新概念。 关于 coduction 和 corecursion 的链接不再有效。 这个链接似乎是关于 coduction 和 corecursion 的一个很好的资源。 cl.cam.ac.uk/archive/mjcg/plans/Coinduction.html 这就是说:没有所谓的“自下而上递归”。自底向上算法根本不进行递归函数调用。

以上是关于自上而下与自下而上的递归数据定义?的主要内容,如果未能解决你的问题,请参考以下文章

递归算法

编译原理随笔4(自下而上的语法分析-递归法)

如何消除左递归何时需要消除左递归—编译原理

Atitit 表达式原理 语法分析 原理与实践 解析java的dsl  递归下降是现阶段主流的语法分析方法

Oracle递归查询(树型查询)

个人作业1——四则运算