递归

递归,又译为递回,在数学与计算机科学中,是指在函数的定义中使用函数自身的方法。递归一词还较常用于描述以自相似方法重复事物的过程。例如,当两面镜子相互之间近似平行时,镜中嵌套的图像是以无限递归的形式出现的。也可以理解为自我复制的过程。

在数学和计算机科学中,当一类对象或方法可以由两个属性定义时,它们表现出递归行为:

例如,以下是某人祖先的递归定义:

斐波那契数列是递归的经典例子:

Fib(0)=1基线条件1;

Fib(1)=1基线条件2;

对所有整数n,n>1时:Fib(n)=(Fib(n-1)+Fib(n-2))。

许多数学公理基于递归规则。例如,皮亚诺公理对自然数的形式定义可以描述为:0是自然数,每个自然数都有一个后继数,它也是自然数。通过这种基线条件和递归规则,可以生成所有自然数的集合。

递归定义的数学对象包括函数、集合,尤其是分形。

递归还有多种开玩笑的“定义”。

递归是当程序的一个步骤涉及调用程序本身的过程。经历递归的过程被称为“递归”。

要理解递归,必须认识到程序和程序运行之间的区别。程序是基于一组规则的一组步骤。程序的运行实际上包括遵循规则和执行步骤。一个类比:一个程序就像一个书面的食谱;运行一个程序就像实际准备饭菜一样。

这提供了一种理解语言创造的方法——无限数量的语法句子——因为它立即预言句子可以是任意长度的:多萝西认为托托怀疑铁皮人说的....除了可以递归定义的句子之外,还有许多结构,因此一个句子可以通过许多方式将一个类别的实例嵌入另一个类别。多年来,一般来说,语言都被证明适合这种分析。

递归有时在计算机科学、程序设计、哲学或数学教科书中幽默地使用,通常是通过给出循环定义或自我引用,在循环定义或自我引用中,假定的递归步骤不会更接近基线条件,而是导致无限回归。这样的书在词汇表中包含一个笑话条目并不罕见,大致如下:

BrianKernighan和DennisRitchie的书《C编程语言》的一些版本的索引在第269页有所变化;索引条目递归引用自身(“递归86、139、141、182、202、269”)。这个笑话的最早版本出现在Kernighan和Plauger的“软件工具”中,也出现在Kernighan和Pike的“UNIX编程环境”中。它没有出现在第一版的《C编程语言》中。

递归首字母缩写也可以是递归幽默的例子。例如,PHP代表“PHPHypertextPreprocessor”,WINE代表“WINEIsNotanEmulator.”,GNU代表“GNU'snotUnix”。

例子:自然数

递归定义集合的典型例子由自然数给出:

0是自然数;

如果n是自然数,那么n+1也是自然数;

自然数集合是满足前两个属性的最小集合。

例子:真正可达命题的集合

另一个有趣的例子是公理系统中所有“真正可达”命题的集合。

这个集合被称为“真正可达命题”,因为在数学基础的非建设性方法中,真正命题的集合可能大于由公理和推理规则递归构造的集合。

有限细分规则是递归的几何形式,可用于创建类似分形的图像。细分规则从由有限多个标签标记的多边形集合开始,然后以仅依赖于原始多边形标签的方式将每个多边形细分为更小的标记多边形,这个过程可被迭代。创建康托集合的标准“中间三分之一”技术是细分规则,重心细分也是细分规则。

一个函数可以根据自身被部分地定义。一个常见的例子是斐波那契数列:F(n)=F(n1)+F(n2)。为了使这样的定义有用,它必须引入非递归定义的值,在这种情况下,F(0)=0,F(1)=1。

一个著名的递归函数是阿克曼函数,它不同于斐波那契数列,如果没有递归,它将无法被表达的。

如前几节所述,将标准的案例证明技术应用于递归定义的集合或函数,会产生结构归纳法,这是数学归纳法的一种强有力的推广,广泛用于数学逻辑和计算机科学中的推导证明。

动态规划是一种优化方法,它以递归的形式重述了多阶段或多步骤优化问题。动态规划的关键结果是贝尔曼方程(Bellmanequation),它将优化问题早期(或较早步骤)的值写入到后期(或较晚步骤)的值中。

在集合论中,这是一个保证递归定义函数存在的定理。给定一个集合X,集合X中的一个元素a和一个函数f:X-->X,定理表明存在一个唯一的函数F:N-->X(N表示包括0的自然数集合),使得满足F(0)=a,F(n+1)=f(F(n))(对于任何自然数n)。

唯一性的证明

取两个函数F:N-->X和G:N-->X使得满足:

F(0)=a

G(0)=a

F(n+1)=f(F(n))

G(n+1)=f(G(n))

其中a是集合X中的一个元素。

数学归纳法可以证明对于所有自然数都有F(n)=G(n):

基线条件:当n=0时,等式F(0)=a=G(0)成立;

递归步骤:假设当k∈N时,F(k)=G(K)成立,然后F(k+1)=f(F(k))=f(G(k))=G(k+1),因此F(k)=G(k)意味着F(k+1)=G(k+1)

通过归纳,F(n)=G(n)(其中n∈N)。

一种常见的简化方法是将一个问题分成相同类型的子问题。作为一种计算机编程技术,这被称为分治法,是许多重要算法设计的关键。分治法是一种自上而下解决问题的方法,通过解决越来越小的实例来解决问题。相反的方法是动态编程,这种方法是自下而上的方法,通过解决越来越大的实例来解决问题,直到达到所需的大小。

递归的一个经典例子是阶乘函数的定义,这里用C代码给出:

unsignedintfactorial(unsignedintn){if(n==0){return1;}else{returnn*factorial(n-1);}}

该函数在输入的较小版本(n-1)上递归调用自身,并将递归调用的结果乘以n,直到达到基线条件,类似于阶乘的数学定义。

当一个函数被定义为更简单、通常更小的自身时,计算机编程中的递归就是一个例子。然后通过组合从问题的简单版本中获得的解决方案来设计问题的解决方案。递归的一个示例应用是在编程语言的解析器中。递归的最大优点是通过有限的计算机程序可以定义、解析或产生无限组可能的句子、设计或其他数据。

递推关系是递归定义一个或多个序列的方程,可以“解决”某些特定类型的递推关系来获得非递归定义。

THE END
1.递归MicrosoftLearn递归和迭代(循环)密切相关,即函数可以使用递归或迭代返回相同的结果。 通常,某个计算适用于一种技巧或另一种技巧,您只须选择最自然或最理想的方法。 虽然递归的用处很大,但是如果使用不慎,创建的递归函数就可能从不返回结果并且不能到达终点。 这种递归导致计算机执行“无限”循环。 下面是一个示例:忽略阶乘计算文字描https://msdn.microsoft.com/zh-cn/library/z3dk2cc3.aspx
2.思维导图递归公式——从简单到复杂的自我调用递归方法就像是剥洋葱,一层一层深入直到核心;而迭代方法则像是滚雪球,一步一步累积结果。两种方法各有千秋,选择哪种取决于问题的性质和求解的便利性。 第三节:公式探索与推演运算【重点在推导】 3.1 斐波那契数列的递归公式 斐波那契数列的递归公式为: https://blog.csdn.net/qq_37148940/article/details/109697695
3.递归,搜索,和回溯算法腾讯云开发者社区递归一共有三层。 第一层:.细节的去看待,递归的细节展开图 第二层:利用二叉树中经典递归题,非常明显的知道要用到递归 第三层:就是宏观的去看待递归的过程 (1)不要在意递归的细节展开图。 (2)把递归函数看做一个黑盒 (3)相信这个黑盒一定能解决这个问题 https://cloud.tencent.com/developer/article/2477481
4.一文读懂递归算法!递归的学习绝对是一个持久战,没有人可以一蹴而就。一年两年的,很寻常。 问题的复杂,加上递归本身的细节,我们想要 "学会","学好",再 "用好",是需要一个漫长的过程的。所以还希望读者有足够的耐心。 一:什么是递归 所谓递归,简单点来说,就是一个函数直接或间接调用自身的一种https://mp.weixin.qq.com/s?__biz=MjM5NzEyMzg4MA==&mid=2649476715&idx=3&sn=d232b6b81f8f9b4b149aa81790b56143&chksm=bec1ac2c89b6253adea0dcbaec9fab884bc06e8aed8241e42667533a305659b5e1a594ea26cb&scene=27
5.Java方法递归的形式和常见递归算法(方法递归结合File类查找文件)方法递归方法直接调用自己或者间接调用自己的形式称为方法递归( recursion),递归做为一种算法在程序设计语言中广泛应用,这篇文章主要介绍了Java方法递归的形式和常见递归算法-方法递归结合File类查找文件,需要的朋友可以参考下+ 目录 方法递归 方法递归的形式 什么是方法递归? 方法直接调用自己或者间接调用自己的形式称为https://www.jb51.net/article/276683.htm
6.从零开始学JAVA——JAVA方法的递归调用那我们什么时候使用递归呢?这里有几个常见的使用场景供大家参考:当一个需要解决的大问题可以拆分成若干个小问题,大小问题的解决方式相同,方法中就可以自己调用自己;可以使用循环解决的常规问题,基本都可以替换为递归进行解决;原问题和拆分后的子问题除了数据规模不同,解决思路完全相同。3. 特点 递归具有逻辑性强https://baijiahao.baidu.com/s?id=1759326051128667121&wfr=spider&for=pc
7.递归式求解的三种方法本节阐述递归式求解的三种方法:递归树、代入法和主定理法。 O、写在前面 在分治法中,时间复杂度T(n)往往具有递归性质,被递归式所表示,譬如T(n)=T(n/4)+T(3n/4)+n,其含义其实是在表示,一个规模为n的问题,被分解为两个规模分别为n/4和3n/4的子问题(其和刚好为n)。容易知道的是T(n)中必然包含子https://www.jianshu.com/p/9863d293eafe
8.高中信息技术课程标准(3)通过实例,掌握使用排序算法设计程序解决问题的方法。 例设计一个程序,按照选择交换法,把学校运动会比赛成绩(无序)按降序排序后存储。 D递归法与问题解决 (1)了解使用递归法设计算法的基本过程。 (2)能够根据具体问题的要求,使用递归法设计算法、编写递归函数、编写程序、求解问题。 https://www.fqkhzx.cn/index/article/view/id/94.html
9.算法入门——递归排序递归做为一种算法在程序设计语言中广泛应用。在代码的世界中,一个程序如果调用自身,那它就是递归的。 更直接地说,递归就是把规模大的问题转化为规模小的相似的子问题来解决。特别地,在函数实现时,因为解决大问题的方法和解决小问题的方法往往是同一个方法,所以就产生了函数调用它自身的情况,这也正是递归的定义所https://zhuanlan.zhihu.com/p/358607812
10.数据分析与数据挖掘包括:卷积运算与池化;卷积神经网络;卷积神经网络应用;循环与递归神经网络;LSTM模型;循环与递归神经的应用。 要求理解卷积神经网络中的局部感受野及权值复用的思想和观点,掌握卷积神经网络及循环递归神经网络等技术,由此进一步掌握卷积神经网络在如机器视觉及自然语言处理中的一些典型应用方法,了解如限制玻尔兹曼机等其它深度网https://i.study.uestc.edu.cn/DATAM/menu/teaching-programme
11.C语言程序设计教学大纲6.教学方法 讲授法、演示法、实践法、指导法、案例法。 7.教学时数 8学时 第七章 用函数实现模块化程序设计 1.教学目标 通过本章教学,使学生掌握函数的定义和调用方法,掌握函数的嵌套和递归调用,掌握形式参数和实际参数的区别,学会调用函数及各种调用方法,掌握变量的存储类别和作用域。 https://yczx.hncu.net/info/1196/1888.htm
12.专利一种ICN报文转发方法发明专利2019年05月14日20191039797172020年12月22日2019103979717王劲林;陈君;程钢;叶晓舟;邓浩江;王玲芳;齐卫宁 一种基于递归混沌码的水声通信均衡译码方法发明专利2019年05月30日201910461708X2020年01月24日201910461708X王海斌;台玉朋;汪俊;陈曦;陈德胜 http://www.ioa.ac.cn/webold/kycg/zl/index_36.html