您的位置:首页 > Web前端 > JavaScript

JavaScript版《剑指offer》刷题(8)跳台阶

2019-06-12 18:49 239 查看
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014465934/article/details/91591607

1.题目描述

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

2.题目分析

题目很简单,稍微分析就知道这是斐波那契数列,所以可以动态规划来做

a.如果两种跳法,1阶或者2阶,那么假定第一次跳的是一阶,那么剩下的是n-1个台阶,跳法是f(n-1);
b.假定第一次跳的是2阶,那么剩下的是n-2个台阶,跳法是f(n-2)
c.由a\b假设可以得出总跳法为: f(n) = f(n-1) + f(n-2)
d.然后通过实际的情况可以得出:只有一阶的时候 f(1) = 1 ,只有两阶的时候可以有 f(2) = 2
e.可以发现最终得出的是一个斐波那契数列

3.代码

////思路,就是一个斐波那契数列,f(n) = f(n-1) + f(n-2),因为第一次跳跃可以是1级,此时跳法数目就是f(n-1),也可以是2级,此时跳法数目是f(n-2),后面的同理

function fib(n) {
if(n <= 0) return 0;
if(n === 1) return 1;
if(n === 2) return 2;
return fib(n - 1) + fib(n - 2);
}

//非递归实现
function jumpFloor(number)
{
if (number<0){
return -1;
}else if(number <=2){
return number
}
var arr = [];
arr[0] = 1;
arr[1] = 2;
for(var i = 2; i < number; i++) {
arr[i] = arr[i - 1] + arr[i - 2];
}
return arr[number-1];
}

//动态规划
function jumpFloor(number) {
// write code here
let f = 1,
g = 2;
while (--number) {
g += f;
f = g - f;
}
return f;
}

变态跳台阶,每次能跳1~n级,数学归纳f(n) = 2^(n-1)

function jumpFloorII(number)
{
if(number === 0 ){
return -1;
}else{
return Math.pow(2,number-1);
}
}

参考文章:
https://www.cnblogs.com/echovic/p/6430652.html
https://github.com/DavidChen93/-offer-JS-/blob/master/10.2 青蛙跳台阶问题.js
https://www.geek-share.com/detail/2719396340.html
https://www.jianshu.com/p/08a25b867828
https://www.jianshu.com/p/6cb6a90769cb
https://www.cnblogs.com/hui-fly/p/9459153.html

https://www.geek-share.com/detail/2738044276.html
https://www.nowcoder.com/questionTerminal/8c82a5b80378478f9484d87d1c5f12a4?commentTags=JavaScript

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: