變態青蛙跳

題目描述

一隻青蛙一次能夠跳上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)階跳法。

不管怎麼加在中間,確定是 有重複的跳法。

相關文章
相關標籤/搜索