一只青蛙一次能够跳上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)阶跳法。
不管怎么加在中间,确定是 有重复的跳法。