递归发生在一个事物根据其本身或其类型定义的时候。递归用于各种学科,从语言学到逻辑学。递归最常见的应用是数学和计算机科学,其中定义的函数应用在自己的定义中。虽然这显然定义了无数个实例(函数值),但通常是这样做的,即不会出现循环或无限的引用链。
内容
[ 隐藏 ]
正式的定义
在数学和计算机科学中,一类对象或方法可以通过两个属性来定义递归行为:
- 一个简单的基本案例(或多个案例) - 一种不使用递归来产生答案的终止方案
- 一套规则将所有其他情况减少到基本情况
例如,下面是一个人祖先的递归定义:
的斐波纳契数列是递归的一个典型的例子:
许多数学公理是基于递归规则的。例如,的正式定义自然数由皮亚诺公理可以被描述为:0为自然数,并且每个自然数具有后继,这也是一个自然数。通过这个基本情况和递归规则,可以生成所有自然数的集合。
递归的方法有很多种,看到递归的幽默。
非正式的定义
递归是程序的一个步骤涉及调用程序本身的过程。经历递归的过程被认为是“递归的”。
为了理解递归,人们必须认识到程序和程序运行之间的区别。过程是一组基于一组规则的步骤。程序的运行涉及到实际遵循规则和执行步骤。一个类比:一个程序就像一个书面的配方; 运行一个程序就像是在准备这顿饭。
递归与其他程序的执行过程的规范中的引用有关,但不相同。例如,一个食谱可能是指烹调蔬菜,这是另一个程序,反过来需要加热水,等等。然而,递归过程是其中(至少)其中一个步骤需要一个相同过程的新实例,就像一个酸面团食谱呼吁从上一次相同的配方留下了一些面团。这当然会立即产生无限循环的可能性; 递归只能在定义中正确使用,如果在某些情况下跳过问题的步骤,以便程序可以完成,就像一个酸面食谱,也可以告诉你如何得到一些起始面团,以防万一以前从未做过。即使正确定义,递归过程对于人类来说也不容易,因为它需要区分新旧程序的调用(部分执行)。这需要一些管理程序的各种同时实例进展的程度。出于这个原因,递归定义在日常情况下非常罕见。一个例子可能是以下程序通过a找到一个方法迷宫。继续向前,直到到达出口或分支点(死端被认为是具有0个分支的分支点)。如果达到的点是退出,则终止。否则递归地使用该过程轮流尝试每个分支; 如果每一次试验都只能到达死路一条,那么返回导致这个分支点的路径并报告失败。这是否实际上定义了终止程序取决于迷宫的性质:它不允许循环。在任何情况下,执行该过程都需要仔细记录所有当前探索的分支点,并且已经彻底尝试了哪个分支。
用语言
语言学家诺姆·乔姆斯基(Noam Chomsky)等人认为,语言中语法句子的数量缺乏上限,语法句子长度的上限也不存在(超出实际限制,例如可用时间)可以解释为自然语言递归的结果。[1] [2]这可以通过语法类别(如句子)的递归定义来理解。一个句子可以有一个结构,其中动词后面是另一个句子:多萝西认为女巫是危险的,其中女巫是危险的发生在较大的一个。因此,一个句子可以递归地(非常粗略地)定义为具有包括名词短语,动词和可选的另一个句子的结构的东西。这实际上只是递归的数学定义的特例。
这为我们理解的语言语法的无限数量的创造力的方式句子,因为它马上预测,句子可以是任意长度:多萝西认为,托托怀疑曾锡文说,...。当然,除了可以递归地定义的句子之外,还有许多结构,因此句子可以将一个类别的实例嵌入到另一个类别的许多方面。多年来,一般的语言都证明了这种分析。
然而,最近人们普遍接受的认为,递归是人类语言的一个重要属性,丹尼尔·埃弗里特(Daniel Everett)根据他对比拉哈语(Pirahã)的说法提出了质疑。安德鲁Nevins,大卫Pesetsky和Cilene罗德里格斯是谁反对这个争论。[3]文学自参考可以在任何情况下被认为是在一种从数学或逻辑递归不同。[4]
递归不仅在语法上,而且在自然语言语义中都起着至关重要的作用。这个词和,例如,可以被理解为可应用于判的意义,创造新的句子,同样的名词短语的含义,动词短语的含义,以及其他功能。它也适用于不及物动词,及物动词或双反动词。为了给它提供一个适当灵活的单一的外延,并且通常被定义为可以将这些不同类型的含义当作论据。这可以通过将它定义为一个简单的情况来完成,在这个简单的情况下,它将句子结合起来,然后用简单的方式递归地定义其他情况。[5]
递归的幽默
递归有时在计算机科学,程序设计,哲学或数学教科书中被幽默地使用,通常通过给出循环定义或自引用,其中推定的递归步骤不接近基本情况,而是导致无限回归。这样的书籍在他们的词汇表中包括一个笑话条目并不少见:
- 递归, 请参阅递归 。 [6]
Brian Kernighan和Dennis Ritchie的书“ The C Programming Language ”的某些版本的索引中的第269页中有一个变体,索引条目递归引用自身(“递归86,139,141,182,202,269”)。这个笑话最早的版本是Kernighan和Plauger的“软件工具”,也出现在Kernighan和Pike的“UNIX编程环境”中。它没有出现在C语言的第一版中。
另一个笑话是“为了理解递归,你必须理解递归。” [6]在谷歌网络搜索引擎的英文版本中,当搜索“递归”时,网站建议“你的意思是:递归”。另一种形式是Andrew Plotkin:“如果你已经知道递归是什么,就记住答案,否则找一个比你更接近Douglas Hofstadter的人,然后问他或她什么是递归。
递归首字母缩写词也可以是递归幽默的例子。PHP,例如,全称是“PHP超文本预处理器”,葡萄酒代表“酒不是一个仿真器。” 而GNU代表“GNU不是Unix”。
在数学
递归定义的集合
例如:自然数
递归定义集的典型例子由自然数给出:
-
0在
-
如果
n
在
,那么 n + 1在
- 自然数集合是满足前两个属性的最小集合。
示例:真正可达命题的集合
另一个有趣的例子是公理系统中所有“真正可达”命题的集合。
- 如果一个命题是一个公理,它是一个真正可达的命题。
- 如果一个命题可以通过推理规则从真正可达的命题中获得,那么这是一个真正可达的命题。
- 真正可达的命题集合是满足这些条件的最小命题集合。
这个集合被称为“真正可达的命题”,因为在对数学基础的非建构性方法中,真正命题的集合可能大于从公理和推理规则递归构建的集合。另见哥德尔的不完备性定理。
有限的细分规则
有限的细分规则是递归的几何形式,可用于创建类似分形的图像。细分规则从有限多个标签标记的多边形集合开始,然后将每个多边形细分为更小的标记多边形,这种方式仅取决于原始多边形的标签。这个过程可以迭代。创建Cantor集合的标准“中间三分之二”技术是细分规则,重心细分也是细分规则。
功能递归
一个功能本身可以被部分地定义。一个熟悉的例子是斐波那契数列:F(n)= F(n - 1)+ F(n - 2)。为了使这样的定义有用,它必须导致非递归定义的值,在这种情况下,F(0)= 0和F(1)= 1。
一个着名的递归函数是阿克曼函数,它不像斐波那契数列那样不能很容易地表达而不用递归。
涉及递归定义的证明
施加的标准技术通过例证明递归定义的集或功能,如在前面的章节中,产生结构归纳,一个强大的一般化数学归纳法广泛用于导出在证明数学逻辑和计算机科学。
递归优化
动态规划是一种方法来优化是重申在递归形式多期或多步优化问题。动态规划中的关键结果是贝尔曼(Bellman)方程,它在较晚的时间(或稍后的步骤),将优化问题的值在较早的时间(或较早的步骤)写入其值。
在计算机科学
简化的一种常见方法是将问题分成相同类型的子问题。作为一种计算机编程技术,这被称为分而治之,是许多重要算法设计的关键。分而治之是一种自上而下的解决问题的方法,通过解决越来越小的问题来解决问题。相反的方法是动态编程。这种方法是一种自下而上的方法,通过解决越来越大的实例来解决问题,直到达到所需的大小。
递归的典型例子是在C代码中给出的阶乘函数的定义:
无符号 INT 阶乘(无符号 INT Ñ ) {
如果 (ñ == 0 ) {
返回 1 ;
} else {
return n * factorial (n - 1 );
}
}
该函数在较小版本的输入(n-1)上递归调用,并将递归调用的结果乘以n,直到达到基本情况,类似于factorial的数学定义。
计算机编程中的递归是以一个简单的,通常是较小的版本来定义一个函数的例子。问题的解决方案是通过结合从较简单的版本得到的解决方案来设计的。递归的一个示例应用是用于编程语言的解析器。递归的巨大优势在于可以通过有限的计算机程序来定义,分析或生成无限可能的句子,设计或其他数据。
复发关系是递归地定义一个或多个序列的等式。可以“解决”某些特定类型的递归关系以获得非递归定义。
在算法中使用递归具有优点和缺点。主要优点通常是简单。主要的缺点是如果递归的深度非常大,算法往往需要大量的内存。
在艺术
俄罗斯娃娃或俄罗斯娃娃是一个递归概念的物理艺术的例子。[7]
自从乔托于1320年制作的Stefaneschi三联画以来,递归已被用于绘画。它的中央面板包含Stefaneschi枢机主教的跪姿,举起三联画本身作为祭品。[8]
MC埃舍尔的 “ 画廊”(1956年)是一幅描绘扭曲的城市,其中包含一个画廊递归包含的图片,因此无限。[9]
递归定理
在集合论中,这是一个保证递归定义函数存在的定理。给定一组X,元素一个的X和功能,定理说明有一个独特的功能
(哪里
表示包括零的自然数的集合)使得
对于任何自然数ñ。
唯一性证明
采取两个功能 和
这样:
其中a是X的元素。
数学归纳法可以证明这一点所有自然数n:
-
基础案例
:
所以平等是成立的
。
-
归纳步骤
:假设
对于一些
。然后
- 因此F(k)= G(k)意味着F(k + 1)= G(k + 1)。
通过归纳, 对全部
。
例子
一些常见的复发关系是: