斐波那契数列题目描述
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。
n<=39
思路
建立一个元素,存放斐波那契数列的每一项,从第二项开始遍历到第n项,根据相加规律得到新元素的值,最后return最后一项
代码
function Fibonacci(n)
{
let a = [0, 1];
if (n <= 0) {
return a[0];
}
if (n === 1) {
return a[1];
}
for (let i = 2; i <= n; i++) {
a[i] = a[i - 1] + a[i - 2];
}
return a[n];
}
function Fibonacci(n,pre =0, next =1) {
//尾递归优化版本
if(n<=0) return pre;
if(n===1) return next;
return Fibonacci(n-1,next,pre+next);
}
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;
}
跳台阶
题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果。
思路
青蛙的最后一次跳法只有两种:一阶和二阶,所以
f(n)=f(n-1)+f(n-2),其实就是斐波那契数列,修改一下0,1的元素和输出的数组下标就可以了:
方法一,递归法
function Fibonacci(n)
{
/* 方法一 递归,但是容易出现调用栈溢出的情况*/
if(n<=0) return 0;
if(n===1) return 1;
return Fibonacci(n-1)+Fibonacci(n-2);
但是直接使用递归法,容易出现调用栈溢出问题,而且随着调用层数增加,速度会很慢。最明显的就是,牛客网上递归版跑不通。
方法二,迭代法
:迭代,代码稍微多那么几行,但是速度快啊!
//跳台阶
function jumpFloor(number) {
// write code here
let a = [1, 2];
if (number === 1) {
return a[0];
}
if (number === 2) {
return a[1];
}
for (let i = 2; i <= number; i++) {
a[i] = a[i - 1] + a[i - 2];
}
return a[number - 1];
}
jumpFloor(1);
jumpFloor(2);
jumpFloor(3);
jumpFloor(4);
变态跳台阶
一只青蛙一次可以跳上1级台阶,也可以跳上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(0)
因为f(n-1)=f(n-2)+f(n-3)+…+f(1)+f(0)
所以f(n)=2*f(n-1) (n>1)
f(0)=0,f(1)=1,f(2)=2,f(3)=4……f(n)=2的n-1次方
代码
function jumpFloorII(number) {
if (number <= 0) {
return 0;
}
return Math.pow(2, number - 1);
}
参考https://blog.csdn.net/sinat_36521655/article/details/80596061