日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【使用递归玩通关汉诺塔游戏】算法01-递归(斐波那契数列、汉罗塔问题)-java实现

發(fā)布時間:2025/3/21 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【使用递归玩通关汉诺塔游戏】算法01-递归(斐波那契数列、汉罗塔问题)-java实现 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

遞歸

定義:在一個方法(函數(shù))的內(nèi)部調(diào)用該方法(函數(shù))本身的編程方式

簡而言之就是 “自己調(diào)自己”

在玩游戲之前讓我們先對遞歸有一個簡單的了解吧!

5.1 遞歸簡介

遞歸必須有一個出口,也就是說必須有一個限制條件,不能無限制的自己調(diào)用自己,否則會出現(xiàn)棧溢出的錯誤

我們看一個最簡單的遞歸代碼:

public class TestRecursive {public void recursive(int index){if(index>0){System.out.println("我在遞歸哦!"+index);recursive(--index);}}public static void main(String[] args) {new TestRecursive().recursive(3);} }

結(jié)果:

我在遞歸哦!3 我在遞歸哦!2 我在遞歸哦!1

以上遞歸的結(jié)束條件就是index>0
下面我們來看兩個遞歸的應(yīng)用:斐波那契數(shù)列和漢羅塔問題

5.2 斐波那契數(shù)列

斐波那契數(shù)列:1,1,2,3,5,8,13,… (每一項(xiàng)數(shù)大小等于其前兩項(xiàng)之和)

要求第n項(xiàng)斐波那契數(shù)是多少

代碼:

public class Test_Febonacci {public static void main(String[] args) {System.out.println(febonacci(5));}//斐波那契:1 1 2 3 5 8 13...public static int febonacci(int n){//第一項(xiàng)和第二項(xiàng)直接返回1if(n==1||n==2){return 1;//從第三項(xiàng)開始,每一項(xiàng)都等于前兩項(xiàng)之和}else{return febonacci(n-1)+febonacci(n-2);}} }

結(jié)果:

5

5.3 漢諾塔問題

5.3.1 簡介

我們先來玩一個漢諾塔游戲吧
(4399 漢諾塔游戲鏈接:http://www.4399.com/flash/109504_1.html)
感興趣的同學(xué)可以先去玩一玩再回來接著看
漢諾塔游戲規(guī)則如下:

第一關(guān)很簡單,這里就跳過了

第2關(guān):

解法:第1個盤子->第2根柱子
第2個盤子->第3根柱子
第1個盤子->第3根柱子


第三關(guān)的步驟就較為復(fù)雜了,但是應(yīng)該也能看出來,這里就不列出來了
通過上面簡單的游戲,我們可以得到如下過關(guān)步驟

  • 先把最下面的盤子以上的全部盤子移動到第二根柱子(遞歸)
  • 將做下面一個盤子移動到第三柱子
  • 最后將第二個柱子上面的所有盤子移動到第三柱子(遞歸)
  • 這里有人就會說了:游戲規(guī)則不是一次只能移動一個盤子嗎
    對,每錯,雖然我們一次只能移動一個盤子,但是以上的1.3步驟都是要通過遞歸來移動盤子的。
    而我們遞歸結(jié)束的條件就是只有一個盤子,上代碼:

    5.3.2 代碼

    public class Hanoi {/**** @param n 盤子個數(shù)* @param from 移動的起始位置* @param mid 移動需要借助的位置* @param to 移動的終點(diǎn)位置*/public static void hanoi(int n,char from,char mid,char to){//如果只有一個盤子if(n==1){System.out.println("將第1個盤子從"+from+"移到"+to);//多個盤子,無論多少個盤子看成兩個盤子:最下面一個盤子和上面所有盤子}else{//1.將上面所有盤子移動到中間位置midhanoi(n-1,from,to,mid);//2.將最后一個盤子移動到目標(biāo)位置toSystem.out.println("將第"+n+"個盤子從"+from+"移到"+to);//3.最后將中間位置的盤子移動到tohanoi(n-1,mid,from,to);}}//測試public static void main(String[] args) {hanoi(4,'A','B','C');} }

    結(jié)果:

    一個盤子

    將第1個盤子從A移到C

    兩個盤子時

    將第1個盤子從A移到B 將第2個盤子從A移到C 將第1個盤子從B移到C

    三個盤子時

    將第1個盤子從A移到C 將第2個盤子從A移到B 將第1個盤子從C移到B 將第3個盤子從A移到C 將第1個盤子從B移到A 將第2個盤子從B移到C 將第1個盤子從A移到C

    對了,看到這里你就可以去把漢諾塔游戲玩通關(guān)了

    總結(jié)

    以上是生活随笔為你收集整理的【使用递归玩通关汉诺塔游戏】算法01-递归(斐波那契数列、汉罗塔问题)-java实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。