牛客网练习题传送门
题目描述
解题方法
方法一:普通递归,但是容易出现调用栈溢出问题,而且随着调用层数增加,速度会很慢。最明显的就是,牛客网上递归版跑不通。
function Fibonacci(n)
{
/* 方法一 递归,但是容易出现调用栈溢出的情况*/
if(n<=0) return 0;
if(n===1) return 1;
return Fibonacci(n-1)+Fibonacci(n-2);
}
方法二:迭代,代码稍微多那么几行,但是速度快啊!
function Fibonacci(n) {
/* 方法二 迭代 */
let pre = 0,
next = 1,
fib = 0;
if(n<=0) return pre;
if(n===1) return next;
for(let i = 1;i<n;i++){
fib = pre+next;
pre = next;
next = fib;
}
return fib;
}
方法三:优化普通递归版本,变成尾递归优化。JS实现了尾调用优化。牛客网上也能跑,但是相当于修改了接口参数,在实际开发时不建议随便修改接口参数。
function Fibonacci(n,pre =0, next =1) {
//尾递归优化版本
if(n<=0) return pre;
if(n===1) return next;
return Fibonacci(n-1,next,pre+next);
}
跳台阶问题
牛客网练习题传送门
题目:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
理解:青蛙跳台阶问题其实就是斐波那契数列数列。当0阶台阶时,0种跳法;当1阶台阶时,只有1种跳法;当2阶台阶时,有2中跳法。现假设n阶台阶可以有f(n)中跳法,那么第一次跳一级的情况下,剩下的跳法有f(n-1)种,第一次跳2级的情况下,剩下的跳法有f(n-2)种,即f(n)=f(n-1)+f(n-2).
这就是斐波那契数列了嘛,只不过初始条件不太一样。附上一个迭代版的,其他版本的区别不大,改改初始条件即可。
function jumpFloor(number)
{
// write code here
let pre = 1,
next = 1,
fib = 0;
if(number<=0) return 0;
if(number===1) return next;
for(let i = 1;i<number;i++){
fib = pre+next;
pre = next;
next = fib;
}
return fib;
}
变态跳台阶问题
牛客网练习题传送门
题目:一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
思路:0阶时0种;1阶时1种;2阶时2种;3阶时3种......数学归纳法推导可知,假设n级台阶总有f(n)种跳法,则f(n)=2的(n-1)次方,即2^(n-1)种。代码可以说非常简单,利用Math的静态方法pow()即可
function jumpFloorII(number)
{
// write code here
if(number<=0) return 0;
return Math.pow(2,number -1);
}