变态跳台阶问题描述:
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
做这个题目想到的第一个算法是利用递推实现,
Int JumpFloorII(int number){
If(0==number)
Return 0;
If(1==number)
Return 1;
Int count = 1;
While(--number){
Count += JumpFloorII(number);
}
Return count;
}
青蛙跳台阶可以随便选择台阶级数,f(n)有自己独特的一种跳法,就是一次跳n阶,因此count=1,f(n)比低于自己的每一级台阶只多出一种跳法就是到达f(i)时,f(i)阶一次跳n-i级台阶,所以有 while循环相加。
下面我们用数学方法来分析题目,转换思想会让题目更简单,
变态跳台阶,最后到达n阶,就是不大于n的整数相加的和为n,如下
K0+K1+K2+K3+...+ki = n,(0<ki<=n)
首先可以想象成n个1相加 1+1+1+...+1=n,然后在n个1之间的n-1个空隙中插入隔板,最后再加1,因为n=n也算一种方法,
当在n-1个空隙中插入一个隔板时共有 Cn-11 方法
当在n-1个空隙中插入两个隔板时 Cn-12
三个 Cn-13
最多可以插入n-1个隔板 , 共有 Cn-1n-1种方法,
最后不插隔板也是一种方法 1
以上的方法相加为 Cn-11 +Cn-12 +Cn-13 +...+Cn-1n-1 + 1 ,1可以写成Cn-10,因此计算公式为Cn-10 +Cn-11 +Cn-12 +Cn-13 +...+Cn-1n-1 ,高中学过的组合恒等式为C0n+C1n+C2n+...+Cnn=2n,把n换成n-1,青蛙跳台阶共有2n-1种方法,程序代码也可以写成如下:
Int JumpFloorII(int number)
{
Return 1 << --number;
}
程序中利用1左移来进行2的n次方运算,
总结:
当解决数学问题时,转换思路多联系到数学公式会很方便。