变态跳台阶算法分析

时间:2022-06-12 16:04:09

变态跳台阶问题描述:

  一只青蛙一次可以跳上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=1f(n)比低于自己的每一级台阶只多出一种跳法就是到达f(i)时,f(i)阶一次跳n-i级台阶,所以有 while循环相加。

 

下面我们用数学方法来分析题目,转换思想会让题目更简单,

变态跳台阶,最后到达n阶,就是不大于n的整数相加的和为n,如下

K0+K1+K2+K3+...+ki = n,(0<ki<=n)

首先可以想象成n1相加 1+1+1+...+1=n,然后在n1之间的n-1个空隙中插入隔板,最后再加1,因为n=n也算一种方法,

当在n-1个空隙中插入一个隔板时共有  Cn-11 方法

当在n-1个空隙中插入两个隔板时      Cn-12

                                三个            Cn-13

最多可以插入n-1个隔板 ,  共有   Cn-1n-1种方法,

最后不插隔板也是一种方法            1

以上的方法相加为  Cn-11 +Cn-1+Cn-1+...+Cn-1n-1 + 1 ,1可以写成Cn-10,因此计算公式为Cn-10 +Cn-11 +Cn-1+Cn-1+...+Cn-1n-1 ,高中学过的组合恒等式为C0n+C1n+C2n+...+Cnn=2n,把n换成n-1,青蛙跳台阶共有2n-1种方法,程序代码也可以写成如下:

Int JumpFloorII(int number)

{

Return 1 << --number;

}

程序中利用1左移来进行2n次方运算,

总结:

  当解决数学问题时,转换思路多联系到数学公式会很方便。