1. 程式人生 > >"漢諾塔"演算法-之通俗易懂,簡單的原理-java程式設計

"漢諾塔"演算法-之通俗易懂,簡單的原理-java程式設計

1.初步介紹

   很多朋友向我諮詢漢諾塔的執行過程和原理,其實對於漢諾塔問題,如果不採用遞迴演算法,這種問題就會難以解答,那麼下面我通過圖解和程式碼統一把過程和原理寫出來,並講解一些技巧,希望能幫組大家完全理解這個過程和原理.

2.圖解執行過程

執行過程圖:
這裡寫圖片描述

3.特點分析

解決問題的關鍵,忽略小細節,注重大步驟,這就是遞迴的精華所在.
解決”三步曲”:

  • 1.A柱子把”共n-1”個盤藉助C盤移動到B盤,完成一個大過程
  • 2.A柱子把剩下的”第n”個盤直接移動到C盤,完成一個大過程
  • 3.B柱子上的”共n-1”個盤藉助A移動到C盤,又完成一個大過程

這”三步曲”結合遞迴方法,即可輕鬆解決問題,以下是給出的詳細程式碼

4.詳細程式碼

    /**
         * 漢諾塔(唯有遞迴才能解決的問題):
         *
         * ABC三個柱子
         * 
         * 1.3個碟片在A柱子(上到下是小盤到大盤)
         * 
         * 2.要求把碟片移動到C柱子
         * 
         * 3.移動過程中,柱子不能出現小盤在下面
         *
         * 4.需求:請列出移動的過程,還有移動的次數;
         *
         * 先分析大過程,忽視細節
         * 
         * 1. A柱子的3個盤子,兩個盤子肯定藉助C移動到B,完成一個大階段:
         * 
         * 2. 當A柱子的只剩下最大盤子,那麼移動到C
         * 
         * 3. B柱子的兩個盤藉助A移動到C
         * 
         * 解決的關鍵是記住大的方向
         */
public class Demo01 { private static int moveCount; public static void main(String[] args) { getNum(2); } private static void getNum(int num) { char a = 'A'; char b = 'B'; char c = 'C'
; moveCount = 0;//計數器 move(num, a, b, c); System.out.println("moveCount = "+moveCount);//列印移動的步驟 } /** * * @param moveNum * 移動的個數 * @param a * 原柱子 * @param b * 輔助柱 * @param c * 目標柱子 */ private static void move(int moveNum, char a, char b, char c) {//原->輔助->目標 moveCount++; // 看圖:2.只有一個時,A把("第"n)個移動到C // 內部: 只有一個時,原柱子->目標柱子 if (moveNum == 1) { System.out.println("from # " + a + " move " + moveNum + " to " + c); } else { // 看圖: 1.A借C把("共"n-1個)移動到B // 內部: 多個:原柱子->輔助柱子 // C變成輔助,所以排在第二位,B變成目標; move(moveNum - 1, a, c, b); System.out.println("from - " + a + " move " + moveNum + " to " + c); // 看圖: 3.B借A把("共"n-1)個移動到C // 內部: 多個:輔助柱->目標柱子 // A是輔助,所以排在第二位置,C變目標; move(moveNum - 1, b, a, c); } } }

執行結果:

from  A move 1 to C
from  A move 2 to B
from  C move 1 to B
from  A move 3 to C
from  B move 1 to A
from  B move 2 to C
from  A move 1 to C
moveCount = 7

很多朋友還是想讓我畫出詳細的內部圖,那麼下面我就把完整的程式碼內部執行流程寫出來給大家:

(ps:這裡最重要的就是注意引數,考慮內部的時候,不要一直把A就當作原柱子,B當作輔助柱子,C當作目標柱子,而是根據move(n,引數1,引數2,引數3),因為A,C也可以充當輔助柱子,這裡固定不變的是:引數1,為原柱子,2為輔助柱,3為目標柱)

內部流程圖:
這裡寫圖片描述

5.總結

漢諾塔,內部的執行過程是相對繁瑣的,所以大家只要記住3個步驟就可以輕鬆解決並容易記住該演算法:

三個柱子:1.原柱子2.中間柱(輔助)3.目標柱
    1.A把"共"n-1個通過C移到B(遞迴)
    2.如果只剩一個:A把"第"n個直接移動到C盤(列印)
    3.B在通過A把"共"n-1個移到C(遞迴)

好了,關於漢諾塔的問題就先給大家講到這裡,大家有什麼見解請留言相互學習.

相關推薦

""演算法-通俗易懂,簡單原理-java程式設計

1.初步介紹 很多朋友向我諮詢漢諾塔的執行過程和原理,其實對於漢諾塔問題,如果不採用遞迴演算法,這種問題就會難以解答,那麼下面我通過圖解和程式碼統一把過程和原理寫出來,並講解一些技巧,希望能幫組

問題Python

漢諾塔問題 把A柱子上若干個圓盤(從大到小依次往上),藉助柱子B,移動到柱子C上去,要求一次只能移動一個圓盤,且大盤子不能放在小盤子上面。 遞迴求解! # Hanoi T

"雙向連結串列"-資料結構演算法-通俗易懂,完全解析

1.概念的引入 相信大家都使用過各種集合來進行開發,但是較少的人會去研究其內部的儲存原理和呼叫方法,今天我就來帶大家一起學習資料結構演算法:雙向連結串列 首先我們先來了解什麼是快取,以及資料在記憶體中的儲存方式. 1.快取是什麼 如果cup讀取資料時

Python 實現演算法

# coding: utf-8 def my_print(args): print args # 將n個盤子從a移動到c, 以b為中介 def move(n, a, b, c): if n == 1: # 若只有一個盤子,直接從a移動

"二分法"-"折半法"-查詢演算法-通俗易懂,圖文+程式碼詳解-java程式設計

1.特點及概念介紹 下面給大家講解一下"二分法查詢"這個java基礎查詢演算法,那麼什麼是二分法呢?其實所謂的"二分法",就是一分為二的意思,綜合起來理解就是一分為二的查詢,但大家記住了,

常用演算法(一)——遞迴(斐波那契數列和演算法

1.遞迴定義 在一個方法(函式)的內部呼叫該方法(函式)本身的程式設計方式。 2.遞迴實現 (1)錯誤寫法:   遞迴最容易引發的一個異常是棧溢位異常。   如果一直遞迴,沒有結束條件,就會無限進行下去,引發棧溢位異常。 package cn.kimtia

演算法分析

演算法描述:  漢諾塔主要是有三個塔座X,Y,Z,要求將三個大小不同,依小到大編號為1,2.....n的圓盤從A移動到塔座Z上,要求 (1):每次只能移動一個圓盤 (2):圓盤可以插到X,Y,Z中任一塔座上 (3):任何時候不能將一個較大的圓盤壓在較小的圓盤之上 程式實現

演算法問題

問題描述 漢諾塔問題是一個經典的問題。漢諾塔(Hanoi Tower),又稱河內塔,源於印度一個古老傳說。大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片黃金圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定,

演算法問題的解法(Java)、思路以及舉一反三

首先,先放程式碼,講解以及註釋將會在後文裡單獨寫出來public class hnt { public static void main(String[] args) { hnts("a","b","c",3); } public static void hnt

演算法

#include<stdio.h> long move(int n);//計算漢諾塔移動次數的函式 int main(){  int n;  printf("請輸入一個正整數\n"); //輸入漢諾塔的層數  scanf("%d",&n);  print

(優秀演算法)對經典遞迴問題的理解與講解(部分引用大神程式碼,附連結。)

部落格大神的優秀漢諾塔程式碼:喜歡特別冷的冬天下著雪   (侵權聯絡) 本文只是在大神思路的基礎上加以理解。 [cpp] view plain copy  print? #include <stdio.h> //第一個塔為初始塔,中間的塔為借用塔,

遞推遞歸組合數,,回文數問題(java

char n-1 判斷 resource int swa one ise tex 遞推遞歸組合數: 1 思路:用函數求得n!,調用函數計算結果流程圖 2 .1流程圖 3 .1源代碼: import java.util.Scanner; public class

演算法

演算法的概念 計算過程,解決問題的方法 Niklaus Wirth: '程式=資料結構+演算法' 時間複雜度 看下面四組程式碼時間執行最短的是哪個? print('hello world') O(1) for i in range(n): O(n) print('hello

演算法路(四)----(又稱河內

漢諾塔是很簡單也很經典的演算法之一。 漢諾塔是根據一個傳說形成的數學問題: 有三根杆子A,B,C 。A杆上有N個(N>1)穿孔圓盤,盤的尺寸由下到上依次變小。要求按下列規則將所有圓盤移至C杆: * 1 每次只能移動一個圓盤; * 2 大盤不能疊在小盤上面。 提示:可將圓

資料結構經典演算法學習河內

河內之塔 (漢諾塔) 故事背景:河內之塔(Towers of Hanoi)是法國人M.Claus(Lucas)於1883年從泰國帶至法國的,河內為越戰時北越的首都,即現在的胡志明市;1883年法國數學

《資料結構和演算法

一,問題描述:        法國數學家愛德華·盧卡斯曾編寫過一個印度的古老傳說:在世界中心貝拿勒斯(在印度北部)的聖廟裡,一塊黃銅板上插著三根寶石針。印度教的主神梵天在創造世界的時候,在其中一根針上從下到上地穿好了由大到小的64片金片,這就是所謂的漢諾塔。不論白天黑夜,總

簡單演算法解決問題

漢諾塔:漢諾塔(又稱河內塔)問題是源於印度一個古老傳說的益智玩具。大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片黃金圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定,在小圓盤上不能放大圓盤,在三

演算法時間複雜度計算

 設a, b, c是3個塔座:開始時,塔座a上有n個自上而下、由小到大地疊在一起圓盤,各圓盤從小到大編號為1, 2, …, n,現要求將塔座a上的這一疊圓盤移到塔座b上,並仍按同樣順序疊置,移動圓盤時遵守以下移動規則: 規則1:每次只能移動1個圓盤; 規則2:不允許將較大的圓

算法求解最佳步數

mat get inner pan .so 移動 htm print src 寫的不好,但是請尊重版權,轉載請註明出處: http://www.cnblogs.com/xiaovw/ 何為漢諾塔?   答:漢諾塔是根據一個傳說形成的一個問題。漢諾塔(又稱河內塔)問題是源

腳本進擊tatatata……

linux操作環境依舊是centos7與centos6。阿拉的腳本都是放在7上了,6裏的通用性大概有0.5%左右的誤差,錯誤和可完善之處盡請指正。請忽略中二的標題>_<。嘛,某種意義上,這個標題還算貼切。因為這個問題咋一看到就是會給人一種頭大的感覺,踏踏踏踏踏,塔塔塔塔塔塔……哦急死尅。先看過題目