Java实现青蛙跳台阶

来源:互联网 发布:佐川一政 知乎 编辑:程序博客网 时间:2024/05/29 17:52

【补充另一种跳台阶的方式于后】

题目描述

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

我的想法:我记得这是一个斐波那契数列的问题?但是做出来不对。

public class Solution {    public static int JumpFloorII(int target) {        if(target==1){            return 1;        }        int next=1;        int nn=0;        if(target-1>=1)         next=JumpFloorII(target-1);        if(target-2>=1)        nn=JumpFloorII(target-2);        int result=Math.max(next,nn);        return result;            }}


来,学习一下伟大的斐波那契数列吧!

“斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1, F(n)=F(n-1)+F(n-2)(n>=2,n∈N*)


那么回到这个台阶问题:


因为n级台阶,第一步有n种跳法:跳1级、跳2级、到跳n级
跳1级,剩下n-1级,则剩下跳法是f(n-1)
跳2级,剩下n-2级,则剩下跳法是f(n-2)
所以f(n)=f(n-1)+f(n-2)+...+f(1)
因为f(n-1)=f(n-2)+f(n-3)+...+f(1)
所以f(n)=2*f(n-1)


所以如果用递归的话,代码为:

public class Solution {    public int JumpFloorII(int target) {        if (target <= 0) {            return -1;        } else if (target == 1) {            return 1;        } else {            return 2 * JumpFloorII(target - 1);        }    }}

如果是大神的话,代码为:

return  1<<--number;


理由是:

当target等于1时,有1种跳法1<<--1
target=2时,有2种跳法1<<--2
target=3时,有4种跳法1<<--3
target=4时,有8中跳法1<<--4


题目描述

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

这个跟之前的不一样在于,要么跳1个,要么跳2个,没有其他的跳法了。

这里的递推公式是:

f(1)=1;

f(2)=2;

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

f(4)=f(3)+f(2)

.....

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


所以我的递归代码,574ms

public class Solution {    public int JumpFloor(int target) {    if (target <= 0) {            return 0;        }        if (target == 1) {            return 1;        }        if (target == 2) {            return 2;        }               int sum=JumpFloor(target-1)+JumpFloor(target-2);        return sum;                }}


但是大神认为用递归的时间可能太长了,提出了另一种思路: 29ms

public class Solution {    public int JumpFloor(int target) {    if (target <= 0) {            return 0;        }        if (target == 1) {            return 1;        }        if (target == 2) {            return 2;        }       int first = 1;        int second = 2;        int third = 0;        for(int i = 3; i <= target; i++) {            third = first + second;            first = second;            second = third;        }        return third;                }}

f(1)=1;

f(2)=2;

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

f(4)=f(3)+f(2)

f(5)=f(4)+f(3)

看出规律了吗,这里直接用循环就可以了,不需要递归,因为之前的f(3)f(4)都已经计算过了~~





原创粉丝点击