题目:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
分析:先找到跳的最小次数(n/2),可能跳的次数就是n/2~n,而且次数每加1,单次跳1级台阶的数量就会加2,此时可以用到数学中的排列组合来计算不同次数对应的多少中跳法了(符合组合C规则)。同时要对n是奇数还是偶数,分开讨论。
function jumpFloor(number)
{
// write code here
//最小次数
var min=Math.ceil(number/2);
var i=min,j=0;
var type=0;
if(number%2==0){
while(i<=number){
type+=combination(i,j);
i=i+1;
j=j+2;
}
}else{
j=1;
while(i<=number){
type+=combination(i,j);
i=i+1;
j=j+2;
}
}
return type;
}
//自定义组合函数(就是数学排列组合里的C)
function combination(m,n){
return factorial(m,n)/factorial(n,n);//就是Cmn(上面是n,下面是m) = Amn(上面是n,下面是m)/Ann(上下都是n)
}
//自定义一个阶乘函数,就是有n个数相乘,从m开始,每个数减1,如factorial(5,4)就是5*(5-1)*(5-2)*(5-3),相乘的数有4个
function factorial(m,n){
var num = 1;
var count = 0;
for(var i = m;i > 0;i--){
if(count == n){//当循环次数等于指定的相乘个数时,即跳出for循环
break;
}
num = num * i;
count++;
}
return num;
}