跳台阶

题目描述:

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

解题思路:

斐波那契数列指的是这样一个数列: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368。

可以观察到,从第3个数开始,每个数的值都等于前连个数之和。

同时,定义f(0)=0, f(1)=1.

则 f(2)=f(1)+f(0)=1;

  f(3)=f(2)+f(1)=2;

  ... 依次类推,

  f(n)=f(n-1)+f(n-2)

该问题实质是斐波那契数列求和,递推公式为 f(n)=f(n-1)+f(n-2);

可以考虑,小青蛙每一步跳跃只有两种选择:一是再跳一级阶梯到达第 i 级阶梯,此时小青蛙处于第 i-1 级阶梯;或者再跳两级阶梯到达第 i 级阶梯,此时小青蛙处于第 i-2 级阶梯。

于是,i 级阶梯的跳法总和依赖于前 i-1 级阶梯的跳法总数f(i-1)和前 i-2 级阶梯的跳法总数f(i-2)。因为只有两种可能性,所以,f(i)=f(i-1)+f(i-2);

依次类推,可以递归求出n级阶梯跳法之和。

递归算法实现:

public int JumpFloor(int target){
  if(target<0)
    return 0;
  int[] fib={0,1,2}; 
  if(target<3)
    return fib[target];
  return JumpFloor(target-1)+JumpFloor(target-2);
}
备注:此方法不满足空间要求(递归空间)。

非递归算法:
public int JumpFloor(int target){
  if(target<0)
    return 0;
  int[] fib={0,1,2}; 
  if(target<3)
    return fib[target];
  int total=0;
  int firstElem=1;
  int secondElem=2;
  for(int i=3;i<=target;i++){  
    total=firstElem+secondElem;
    firstElem=secondElem;
      secondElem=total;  //迭代
  }
  return total;
}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值