一、斐波那契数列
斐波那契数列为1,1,2,3,5,8,13,21,34…等数组成的数列,用数学公式表达为
F(1) = 1;
F(2) = 2;
F(n) = F(n-1) + F(n-2); (n>=3,n∈N*);
二、代码实现(Javascript)
题目描述:要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。
我的实现(利用递归):
function Fibonacci(n)
{
var m = 0;
if(n === 0) {
m = 0;
} else if (n === 1 || n === 2) {
m = 1;
} else {
m = Fibonacci(n-1) + Fibonacci(n-2);
}
return m;
}
别人的实现(计算速度更快):
function Fibonacci(n)
{
if(n<=1) {return n;}
else {
var f0=0,f1=1,f2=0;
for(var i=2;i<=n;i++){
f2=f0+f1;
f0=f1;
f1=f2;
}
return f2;
}
}
三、跳台阶
题目描述:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
我的实现思路:
一级台阶:1种跳法
二级台阶:2种跳法(1.1/2)
三级台阶:3种跳法(1.1.1/1.2/2.1)
四级台阶:5种跳法(1.1.1.1/1.1.2/1.2.1/2.1.1/2.2)
…
可以发现,与斐波那契数列类似。
还有一种思路是:
跳上第n层,青蛙可以是从第n-1层跳上去,也可以是从第n-2层跳上去(因为一次可以跳一阶或两阶)
因此,跳上第n阶的跳法,等于跳上n-1阶的跳法,加上跳上n-2阶的跳法
即f(n) = f(n-1) + f(n-2) ,n>2(n∈N+)
代码:
function jumpFloor(number)
{
if(number <= 2){
return number;
}else {
var f1 = 1,f2 = 2,f3 = 0;
for(var i = 3;i<=number;i++){
f3 = f1 + f2;
f1 = f2;
f2 = f3;
}
return f3;
}
}
别人的实现:
function jumpFloor(number)
{
if (number < 2) {
return 1
}
let arr = [1, 1]
for (let i = 2; i <= number; i ++) {
arr[i] = arr[i - 1] + arr[i - 2]
}
return arr[number]
}
四、变态跳台阶
题目描述:一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
别人的实现:
function jumpFloorII(number)
{
return 1<<(--number);
}
说明:“ << ”和“ >> ”为按位运算符。
左移“ << ”,比如说:1<<3(相当于1*(2*2*2)
),先将1转为二进制数1,再左移三位,得到1000(二进制),转化为十进制之后是8。
右移“ >> ”也类似,比如说:14>>3,先将4转化为二进制数1110,再右移三位,得到0001,转换为十进制之后是1。