Java解決青蛙跳臺(tái)階問(wèn)題流程
1.問(wèn)題描述
一只青蛙一次可以跳上1階臺(tái)階,也可以跳上2階臺(tái)階,求該青蛙跳上一個(gè)n階臺(tái)階總共有多少種跳法?
2.畫(huà)圖分析?
3.問(wèn)題講解?
一只青蛙,要么1次跳2個(gè)臺(tái)階,要么1次跳1個(gè)臺(tái)階。
假設(shè)3個(gè)臺(tái)階為例:如果1次跳1個(gè)臺(tái)階,那剩下幾種跳法?我們來(lái)仔細(xì)地想一下:
跳了一個(gè)臺(tái)階之后,剩下的臺(tái)階就相當(dāng)于3 -1個(gè)臺(tái)階剩下2個(gè)臺(tái)階,2個(gè)臺(tái)階的跳法如上圖就是2種跳法。
如果一次跳2個(gè)臺(tái)階,剩下的臺(tái)階就相當(dāng)于3 - 2個(gè)臺(tái)階剩下1個(gè)臺(tái)階,1個(gè)臺(tái)階的跳法如上圖是1種跳法。那么加起來(lái)就是3種跳法。
所以說(shuō),你如果想知道n個(gè)臺(tái)階有多少種跳法,其實(shí)就是看n - 1個(gè)臺(tái)階有多少種跳法,加上n - 2個(gè)臺(tái)階有多少種跳法。
規(guī)律看懂后你就發(fā)現(xiàn)這其實(shí)就是一個(gè)變相的斐波那契數(shù)列,只不過(guò)這個(gè)數(shù)列的第一項(xiàng)是1,第二項(xiàng)是2.
4.代碼設(shè)計(jì)思路
我們?cè)賮?lái)看一下斐波那契數(shù)列的寫(xiě)法:
唯一的不同就是斐波那契數(shù)列的前兩個(gè)項(xiàng)都是1
而青蛙跳臺(tái)的第一項(xiàng)為1,第二項(xiàng)為2
只要用遞歸的方法稍作改動(dòng)就能求出我們青蛙跳臺(tái)階的問(wèn)題
5.實(shí)現(xiàn)代碼?
public class TestDemo { public static int frogJump(int n){ if(n == 1 || n == 2){ //當(dāng)n為前2階臺(tái)階的時(shí)候,n是幾就是幾 return n; }else{ return frogJump(n-2)+frogJump(n-1);//求n階臺(tái)階的幾種跳法 } } public static void main(String[] args) { System.out.println(frogJump(1)); System.out.println(frogJump(2)); System.out.println(frogJump(3)); System.out.println(frogJump(4)); } }
打印結(jié)果:
6.代碼升級(jí)
用遞歸的方式雖然可以求解青蛙跳臺(tái)階問(wèn)題,但是這其中會(huì)進(jìn)行大量重復(fù)的計(jì)算。如果求的數(shù)字過(guò)大,程序運(yùn)算出結(jié)果花費(fèi)的時(shí)間會(huì)非常的長(zhǎng),所以我們并不建議在面試出現(xiàn)這樣的問(wèn)題的時(shí)候用遞歸的方法求解。
這里給大家介紹一種更好的求解方式:循環(huán)(迭代)實(shí)現(xiàn)?
畫(huà)圖分析:
給大家解釋一下上圖:?
開(kāi)始f3 = 3,f2 = 2,f1 = 1,
我們先讓f3 = f1 + f2,這么沒(méi)問(wèn)題吧,1+2=3
再來(lái)我們把f2的值賦給f1,此時(shí)f1就等于2,
再把f3的值賦給f2,此時(shí)f2的值就等于3
循環(huán)起來(lái),那此時(shí)再求f3的值就是2+3=5,恰好就是我們4階臺(tái)階的5種跳法。
代碼實(shí)現(xiàn):
第二種寫(xiě)法:循環(huán)(迭代)實(shí)現(xiàn) public class TestDemo { public static int frogJump2(int n){ if(n == 1 || n==2){ return n; } int f1 = 1; int f2 = 2; int f3 = 0; for (int i = 3; i <= n; i++) { f3 = f1+f2; f1 = f2; f2 = f3; } return f3; } public static void main(String[] args) { System.out.println(frogJump2(1)); System.out.println(frogJump2(2)); System.out.println(frogJump2(3)); System.out.println(frogJump2(4)); System.out.println(frogJump2(5)); System.out.println(frogJump2(45)); } }
運(yùn)行結(jié)果:
到此這篇關(guān)于Java解決青蛙跳臺(tái)階問(wèn)題流程的文章就介紹到這了,更多相關(guān)Java 青蛙跳臺(tái)階內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring boot 數(shù)據(jù)庫(kù)連接斷線重連問(wèn)題
這篇文章主要介紹了Spring boot 數(shù)據(jù)庫(kù)連接斷線重連問(wèn)題,需要的朋友可以參考下2017-06-06基于Jenkins搭建.NET FrameWork持續(xù)集成環(huán)境
這篇文章主要介紹了基于Jenkins搭建.NET FrameWork持續(xù)集成環(huán)境,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08SpringBoot自動(dòng)初始化數(shù)據(jù)庫(kù)的方法分享
我們?cè)陧?xiàng)目中應(yīng)該經(jīng)常遇到過(guò)初始化數(shù)據(jù)的場(chǎng)景,特別是項(xiàng)目部署或者交付的時(shí)候,那么有什么方式可以在項(xiàng)目啟動(dòng)的時(shí)候自動(dòng)初始化數(shù)據(jù)庫(kù)呢,下面小編就來(lái)和大家分享幾個(gè)方法吧2023-08-08java 獲取HttpRequest Header的幾種方法(必看篇)
下面小編就為大家?guī)?lái)一篇java 獲取HttpRequest Header的幾種方法(必看篇)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-09-09Springmvc如何返回xml及json格式數(shù)據(jù)
這篇文章主要介紹了Springmvc如何返回xml及json格式數(shù)據(jù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09JavaEE多線程中阻塞隊(duì)列的項(xiàng)目實(shí)踐
本文主要介紹了JavaEE多線程中阻塞隊(duì)列的項(xiàng)目實(shí)踐,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-09-09java-list創(chuàng)建的兩種常見(jiàn)方式
本文給大家分享Java-list創(chuàng)建的兩種常見(jiàn)方式,每種方式結(jié)合實(shí)例代碼給大家講解的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2022-11-11