剑指offer之斐波拉契

1.斐波拉契代码

def f(n):
    if n <= 0:
        return 0
    if n <= 2:
        return 1
    one, two = 1, 1
    for _ in xrange(2, n, 1):
        one, two = two, one+two
    return two

2.更多应用

  • 青蛙跳台阶

    一只青蛙一次可以跳1级台阶,也可以跳2级台阶,求青蛙跳上n级台阶,总共有几种跳法

    分析:只有1级台阶,1种跳法,f(1)=1。只有2级台阶,每步1级跳2步或者1步跳2级,共2中跳法,f(2)=2。当有n级台阶时,第一步有2个选择,选择跳1级,此时跳法种数等于后面剩下的n-1级台阶跳法种数,即f(n-1);选择跳2级,此时跳法种数等于后面剩下的n-2级台阶跳法种数,即f(n-2)。那么合起来就是f(n-1)+f(n-2)。

    同理,如果青蛙可以选择跳1级,2级或者3级,那么f(n)=f(n-1)+f(n-2)+f(n-3)

    More:如果青蛙可以跳1--n级,随意跳几级,那么f(n)=2^n-1(表示2的n-1次方)

  • 矩形覆盖

    用8个2X1的小矩形,无重叠的覆盖一个2X8的大矩形,请问有多少种覆盖方法?

     
     


            
            

    分析:我们记2X8覆盖方法为f(8),假设第一个2X1小矩形在最左侧竖着放,右边还剩2X7区域,右边区域的覆盖方法记为f(7).假设第一个2X1小矩形在最左侧横着放,那么左下角必须有一个小矩形也是横着放,剩下的2X6区域有f(6)种方法。显然,由于第一个有2种选择,f(8)=f(7)+f(6)


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值