递归

上大学那会儿很难理解什么是递归,老师照着课本念,课本也是说地很简洁,就是程序自己调用自己本身,这没啥毛病,可就是不能理解自己调用自己,所以有很长一段实际思维一直禁锢在递归中无法自拔,直到后来自己看了很多关于递归的文章才慢慢看透递归的本质,后来在一次公司的技术分享会上刚好有一个大佬同事分享了一个青蛙跳台阶的递归例子,感觉很通俗易懂。

首先假设我们有一个10个阶梯的楼梯,青蛙每次跳只能跳一阶或者两阶,多了跳不上去了,这很好理解吧,那青蛙跳到第10阶有多少跳法呢?

这看起来有点像概率论,每一次跳可以是1,也可以是2,问这两种组合方式有多少种?
当然我们在这里不考虑概率论的问题,我们讨论如何用递归算出它一共有多少种跳法。

用自顶向下的思维方式,通过分析我们发现,要想到达第10个阶梯那么它最后一次跳只有两种情况,跳了1阶或者2阶,也就是它要么从第9阶跳上去,要么从第8阶跳上去,假设青蛙从第9阶跳上去的,那么它倒数第二次跳要么是从7个阶梯跳上去的,要么是第8个阶梯跳上去的,同理,假设青蛙从第8阶梯跳上去的,那么它前一次也有两种可能。

总结:

青蛙每跳一次台阶,它都有两种可能,跳一阶和跳两阶,但凡是都有例外,那就是当阶梯为1的时候它只有一种跳法,跳一阶,当阶梯等于2的时候只有两种方法,跳1阶两次和跳一次2阶。
这样就得到一个公式:

{f(n)=1 f(n)=2 f(n)=f(n1)+f(n2)  \begin{cases} f(n)= 1 [n=1]\\ f(n)= 2 [n=2]\\ f(n)= f(n-1)+f(n-2) [n>2] \end{cases}

python代码实现如下,很精简,这就是python的风格

def func(n):
    if n <= 0:
        return 'erro'
    if n == 1:
        tmp = 1
    elif n == 2:
        tmp = 2
    else:
        tmp = func(n-1) + func(n-2)
    return tmp

print(func(10))

递归的方法就是一层层地去找答案,想要直到f(n)就要知道f(n-1)f(n-2),想要知道f(n-1)f(n-2)又必须知道f(n-1)的前一项和前两项以及f(n-2)的前一项和前两项,一直推导下去,直到某个结果能够打破这一平衡,导致所有项都能被求出来,那么递归就结束。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章