递归函数的再理解

学习到递归函数的写法时,总是很难深刻理解到背后的设计思想。只知道问题被分解到了,还有一个出口,外加调用自身,最后就能神奇的实现功能。
后来,知道函数调用是一种栈式结构,每一次调用会把当前状态压栈,然后继续往前走,直到调用的函数有结果了,再返回去。
看似理解了背后的逻辑,但是,对于递归的掌握还是仅仅局限于斐波那契数列,阶乘等这些小问题的解决上,再难一点就难以理解,更谈不上随意使用了。

我想根子还是出在原理没有好好理解上。
直到某天,别人告诉我:

递归 = 递推 + 回归

一下子就让我有醍醐灌顶之感,虽然这些在实际理解中已经使用了,但是没有点到这一层的理解,总是欠缺了些什么。

高中数学学得还不错的同学都会直到,求数列的时候,根据递推公式,有很多种好玩的解法。什么错位相除,数列差额等比替换等等。
然后我们常常知道a0,a1,根据an,an-1,an-2等之间的关系,很自然的就能把题解出来。

为什么一到计算机里有不太自然了呢?
就个人而言,是思考的顺序问题。
在数学的解法中,我们根据递推公式会去想推倒一个通项公式,其实要更难一些。因为要经过一些变换得出通项是主要目标,a0,a1只不过是用于检验,带入罢了。
但是在计算机中,由a0,a1可以推出a2,a3,…,an
这样就够了,除非再进一步优化,可以缩减问题规模,比如求出通项,在O(1)时间就能解决问题之类。

那么,带着从a0,a1一直解到an的顺序,递归就很简单了。
首先,我们找到递推公式。e,g:

an = m*an-1 + c

我们看到问题可以往下面拆解:

an-1 = m*an-2 +c
an = m*(m*an-2+c) + c
an-2 = m*an-3 + c
an = m*(m*(an-3+c)+c) + c
…..
an = m*(m*(m*…(m*a1+c)))) +c

直到a1时,发现终于有了出口。最后那个计算m*a1+c的函数调用终于得出了结果可以返回,于是,再倒着回来推出a2,a3,…an

所以写程序的时候要想明白:递推 + 回归。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值