23 递推算法

递推和递归是兄弟吗?

大纲

  • 什么是递推

  • 计算青蛙上台阶问题

  • 汉诺塔问题

  • 猴子吃桃问题

什么是递推算法

我们先用一个例子来对比一下递归和递推的联系和区别。

# 递归
def fibonacc_1(n):
    if n<= 2:
        return 1     # 停止条件
    else:
        return fibonacci(n-1)+fibonacci(n-2)  # 分拆到子问题

fibonacc_1(8)
21
# 递推
def fibonacc_2(n):
    if n in (1,2):  # 初始情况的返回值
        return 1
    a=b=1
    for i in range(1,n):
        new = a+b   # 递推式,后一个数字等于前面两个数字之和
        a=b
        b=new
    return a

fibonacc_2(8)
  • 递推的结构为线型,人的简单逻辑推理(一件事想到另一件事)就是递推的模型。

  • 关于递归,有个经典的例子: 我梦见自己在做梦。递归的特点是,自我嵌套的稍复杂结构。

从上例可以看到,递归算法可以用一个递推来代替。

让我们把上面算法做一个修改,把之前所有结果都存下来。

上台阶问题

一只青蛙一次可以跳上1级台阶,也可以跳上2级,也可以跳3级,求该青蛙跳上一个n级的台阶总共有多少种跳法。

汉诺塔问题

上次课的汉诺塔问题中,我们用递归计算了不同情况下如何移动圆盘,这次我们用递推算法来计算,移动n个圆盘,需要移动多少次?

记得把大象送进冰箱需要几步吗?三大步骤,打开门,移动圆盘,关上门。打开门实际是需要移动n-1个圆盘,送上门也是要移动n-1个圆盘,所以F(n)=F(n-1)+1+F(n-1)

猴子吃桃问题

猴子第一天摘下若干个桃,当即吃一半,又多吃一个。第二天早上又将剩下的一半吃掉一半,又多了吃一个。以后每天早上都吃了前天剩下的一半零一个,到第10天早上只剩下最后一个桃。问第一天摘了几个桃。

Last updated