变态青蛙跳

题目描述

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

 

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

别说2阶是两种。。。

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

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

 

那就要倒着想,如果多了一阶台阶,方法是多了多少呢?

因为我只知道 如果多 了一阶,别 之前的 跳法多了多少,不就能求出了当前台阶的跳法了吗。

 

数学思路:

当前台阶数的跳法,其实是 台阶数的所有 子集 台阶数的跳法(每个子集台阶,然后在直接一下跳到最后一阶)。

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

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

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

 

其他想法:

展现我灵魂画手的实力:

212842_hhOP_3192601.png

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

然后 加了 一阶 变为 n+1 

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

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

213900_wI7v_3192601.png

 

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

214953_aar8_3192601.png

至于台阶加在其他处,不过是将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)阶跳法。

无论怎么加在中间,肯定是 有重复的跳法。

 

 

转载于:https://my.oschina.net/u/3192601/blog/1558363

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值