• 精选
  • 会员

迭代、程序与递归

2020年2月7日  来源:scottcgi 作者: 提供人:zhuoying34......

程序与递归

在计算机程序中,循环有两种,即:迭代循环递归循环

其中,迭代循环只需要固定数量的寄存器即可,而递归循环则需要辅助的堆栈结构,来存储递归过程中的上下文信息。

那么,递归收敛的过程,其实就从远离结果的抽象,向着结果的具体,逐渐逼近的过程。当递归从出口跳出终止的时候,递归程序就获得了最终想要的结果了。

例如,递归求解斐波那契数列,就是在跳出递归循环的时候,层层回溯,得到最后的结果。

而在计算机程序中,递归循环一定需要出口,否则就会变成一个无限递归的死循环——从而导致程序出现无法响应的情况。同理,迭代循环也需要有明确的终止条件,否则也会形成死循环。

那么递归程序,之所以需要一个堆栈结构来存储上下文信息,是因为递归程序也会把过程信息存储在一个重复相同的结构模式之中,只不过这个结构模式,是用程序所构建的数据结构,即:代码实现的函数结构

  • 在数学中,所有方程都是函数,如果在不违反康托尔连续统(即实数)结构的条件下,函数基本可以和方程看成等价。
  • 在程序中,函数其实是一种计算——是一个量到另一个量的计算。

同时,这个函数结构也是一种虚拟的信息结构,其本身也需要一个存储结构,即堆栈结构,而这个堆栈结构,其实是一个通用的抽象结构模型,其本身也需要一个具体的结构实现,即(计算机物理的)硬件结构。

事实上,在程序和编程语言之中,递归是习以为常与无处不在的模式,而在数学证明中,其展开的步骤与收敛的结果(即公式),也可以看成是一种递归

而从底层视角来看,程序——其本质就是用信息来模拟和映射现实,计算——其本质就是用一个系统来模拟另一个系统。

例如,经典计算机——就是用经典物理系统去计算模拟现实,而量子计算机——就是用量子物理系统去计算模拟现实。

由此可以想象,被递归程序所描述、模拟、计算的现实世界,也应该是充满了递归模式的。

然而,或许现实世界,不仅仅是充满了递归的,更或许其本身就是递归的,甚至连整个宇宙都是递归的。

迭代与递归

首先,迭代循环——是整体视角,它可以看清整体变化的过程。

例如,完成一个任务,追到女神。

迭代循环,意味着高屋建瓴地把追到女神,分为若干个步骤,这些步骤可以一样也可以不一样,如送礼物、看电影、请吃饭、或每天嘘寒问暖,等等。然后,一个步骤的执行就是一次迭代,即循环了一次。直到循环结束,如迭代了520次,女神追到了。

其次,递归循环——是局部视角,它无法看清整体变化的过程。

递归循环,则意味着无法知道经历几次迭代,才可以追到女神,只是不断重复同样的行为,如热切的尬聊,但每次尬聊可以发生在不同的场景和时间,如雨天、球场、课后、郊游、深夜等等,即操作相同,环境信息不同。直到女神,在一次尬聊中,回复了520,即代表递归循环的结束,追到女神了。

综上可见,迭代与递归,有时是可以互相转换的,有时却是不行的,而整体与局部视角的不同,就是两者的最大不同。

那么结合上例,我们可以看到:

  • 迭代循环——有一部分依赖信息,必须放到局部之外,所以它是整体视角,才可以在局部之外存放信息。如:追女神的循环次数,以及步骤顺序。
  • 递归循环——则把所有的信息都放在了局部环境之中,并不需要局部之外的信息。如:追到女神的判断,是根据局部操作的反馈来的。

但如果,我们身处在一个循环结构之中,对于迭代递归的判断,又是另外一回事了。因为身处其中,我们会很容易识别——迭代,却很难发现——递归,而只有来到“置身事外”的视角,才能够判断出——我们自身是否是处在一个递归之中。

例如,程序上的递归,一般都不是从整体设计开始的,而是用迭代完成之后,发现如果把迭代优化为递归,则会更加简洁自然与合理,并且有了迭代的经验,以后类似的场景,就可以从局部设计开始,直接实现递归,再回溯到整体设计。

递归 / 宇宙 / 分形 / 循环 / 迭代

如涉及版权,请著作权人与本网站联系,删除或支付费用事宜。

0000