遞歸案例-漢諾塔

如果你對其他算法或者案例感興趣,請考慮閱讀我的以下文章。

遞歸案例-正整數劃分.
遞歸案例-全排列.
動態規劃案例-矩陣連乘(含表格填寫、問題理解、實例解決).
動態規劃案例-最長公共子序列(含表格填寫、問題理解、實例解決、例題答案).
遞歸案例-電路佈線(含表格填寫等超詳細,純人話講解).

問題

設a,b,c是3個塔座。開始時,在塔座a上有一疊共n個圓盤,這些圓盤自下而上,由大到小地疊在一起。各圓盤從小到大編號爲1,2,…,n,現要求將塔座a上的圓盤移到塔座b上,並仍按同樣順序疊置。在移動圓盤時應遵守以下移動規則:

規則1:每次只能移動1個圓盤;
規則2:任何時刻都不允許將較大的圓盤壓在較小的圓盤之上;
規則3:在滿足移動規則1和2的前提下,可將圓盤移至a,b,c中任一塔座上。

問題分析

1.首先令n=3,也就是一開始a柱上有三個盤子分別是1,2和3號盤子。
2.我們將操作 a上的1號盤子移動到c 記作 a1-->c

1.a1–>c
2.a2–>b
3.c1–>b
4.a3–>c
5.b1–>a
6.b2–>c
7.b1–>c
經過上面7步操作,我們成功的把1,2和3號盤子從a柱上經過b柱的幫忙下移動到了c柱上。

算法設計

爲什麼要用遞歸

遞歸的定義:函數調用自身。
我認爲運用遞歸的條件就是:每一步進行的操作基本相同,並且問題規模逐漸減小。
我們可以對上面的例子進行分析:
1.前三步的操作就是將前2個盤子(也就是前n-1個盤子)經c柱從a放到b柱上。

1.a1-->c
2.a2-->b
3.c1-->b

2.第四步的操作就是將第3個盤子(也就是第n個盤子)放到c柱上。

4.a3-->c

3.將前2個盤子(也就是前n-1個盤子)經a柱從b柱放到c柱上。

5.b1-->a
6.b2-->c
7.b1-->c

遞歸函數參數的設計

遞歸函數爲fun(int n,char a,char b,char c),其中n爲盤子的個數,a,b,c分別爲柱子。

算法分析

1.將n-1個盤子經c柱從a柱放到b柱上
2.將第n個盤子放到c柱上
3.將n-1個盤子經a柱從b柱放到c柱上

代碼演示

遞歸函數

public static void fun(int n,char a,char b,char c)
 {
  if(n==1)
   System.out.println(a+" "+n+"--->"+c);
  else {
   fun(n-1, a, c, b);
   System.out.println(a+" "+n+"--->"+c);
   fun(n-1, b, a, c);
  }
 }

主函數調用

public static void main(String[] args) {
  fun(3, 'a', 'b', 'c');
 }

輸出結果

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章