变态青蛙跳

题目描述

一只青蛙一次能够跳上1级台阶,也能够跳上2级……它也能够跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。java

 

相比普通青蛙跳,这个 n级的就有点难了,重点是 能跳n级,  也就是说,只有当台阶数是1的时候,是1种跳法。spa

别说2阶是两种。。。code

3阶 还 4种, 4 阶还 8种。 。。 。明显抬杠。。。。。。。穷举法作的吧?递归

所以只有将台阶 无限的化少,化少,直至 1阶,这样才能找到问题的解决办法。get

 

那就要倒着想,若是多了一阶台阶,方法是多了多少呢?数学

由于我只知道 若是多 了一阶,别 以前的 跳法多了多少,不就能求出了当前台阶的跳法了吗。class

 

数学思路:

当前台阶数的跳法,实际上是 台阶数的全部 子集 台阶数的跳法(每一个子集台阶,而后在直接一下跳到最后一阶)。循环

例如 5阶跳法,其实就是1阶的全部跳法+2阶的全部跳法+3阶的全部跳法+4阶的全部跳法+1(直接跳5阶)。 方法

累加的话就须要写一个  循环,将 n阶 一下一下减,直到1 ,而后将全部台阶跳法 求和,实现起来也不是很难,再写一个静态 sum 就好, 记录 总和im

不过这样就会 循环 调用递归, 递归自己,再次循环,势必数据一多,就是 挂掉。

 

其余想法:

展示我灵魂画手的实力:

假设当前有 n(示意为4) 阶,跳法有x种。  

而后 加了 一阶 变为 n+1 

当台阶是加在4层上面的时候:

青蛙使用  了 x种方法  每种方法都能跳到  n阶上, 而后使用跳1 下的方法,跳上n+1阶。 

 

当台阶是加在1层下面,也就是让青蛙下一个台阶,总台阶仍是 n+1 往上跳。 那么 开始跳1 ,而后剩余的 n阶 仍是 x种跳法。

至于台阶加在其余处,不过是将n阶  “挤” 成了第5阶,实质仍是加了最后1阶。

一次 n阶方法的跳法 就是 2*(n-1) 阶的跳法。

 

 

代码:

public static int JumpFloorII(int target) {
    	if(target==0){
    		return 0;
    	}
    	if(target==1){
    		return 1;
    	}
    	
        return JumpFloorII(--target)*2;
    }

 

错误的想法:

在我想如何组织语言,让大家接受  台阶加在 最顶层,仍是最下层的时候,我差生了一个错误的想法, 

既然是 第一步跳1, 那么 我其实能够将 这多的1步,放在任何位置啊。

其实这是错误的想法, 这里面有严重的跳法重叠 。

好比说我 跳5阶前 加了一步, 跳到了 第6阶上。而后直接 跳最后一阶。

跟 

跳6阶的 跳法  中,而后直接跳到最后一阶 是重复的 跳法。

 

第一种是 5阶跳法 中间多跳1阶,而后跳最后。

第二种是本来的6阶跳法,直接跳 最后。

所以,这种思惟是错误的。

个人想法:

感受这个题目形容起来不是很清晰,看的话估计也不是很明白,这个题目给个人感受就是,多一阶台阶后,其实中间台阶怎么跳法不介意,第一步只能多在 n-1阶跳法的 最前面,跟最后面, 也就是 2*(n-1)阶跳法。

不管怎么加在中间,确定是 有重复的跳法。

相关文章
相关标签/搜索