河內之塔(Towers of Hanoi)問題(1/11)

Slides:



Advertisements
Similar presentations
醫學美學之我見ー肉毒桿菌 班級:應日三乙 姓名:蔡雅卉 學號: 497E0076. 前言 現在的人,已經把 整型看做是微不足 道的事情了。即使 只是戴牙套、局部 雷射、割雙眼皮、 打美白針、肉毒桿 菌等等,都可以在 身體上做不同的改 變,而讓自己更滿 意自己的外表。
Advertisements

Java 程序分类 Java Application :是完整程序,需要独立的解 释器解释运行;以 “.java” 为后缀的文件,以 main() 方法作为程序入口,由 java 编译器编译生 成字节码,由 Java 解释器加载执行字节码。 Java Applet 没有 main() 方法作为程序入口,是嵌在.
单元二:面向对象程序设计 任务二:借书卡程序设计.
3.2 Java的类 Java 类库的概念 语言规则——程序的书写规范 Java语言 类库——已有的有特定功能的Java程序模块
JAVA 编 程 技 术 主编 贾振华 2010年1月.
第一單元 建立java 程式.
101北一女中 資訊選手培訓營 遞迴、河內塔與merge sort Nan.
第1章 Java语言概述.
讲故事训练 授课人:田轶.
第十一課 菜園 6-11.
Java程序设计教程 第一讲 Java概述.
校本选修课 第三专题 西藏问题 北京师大二附中 李文燕.
四資二甲 第三週作業 物件導向程式設計.
Hello小程序的运行和编译 Java AppletJava小程序的构成 1、关键字
正修科技大學教學發展中心 教師教學觀摩與經驗分享 電子工程系 張法憲副教授.
第一章 面向对象程序设计.
多媒體.
The discipline of algorithms
第二章 JAVA语言基础.
蘇軾詞的賞析
類別與物件 Class & Object.
甲型H1N1流感预防常识 北仑区疾病预防控制中心.
TQC+ JAVA全國教師研習會 PLWeb 程式設計練習平台 簡介.
柯奕宏(06) 王予亨(13) 郭秉逸(15) 楊雯凈(23) 顏佑瑩(32)
第十五章 传播学调查研究方法.
Chapter 5 遞迴 資料結構導論 - C語言實作.
自然與生活科技領域 認識太陽能 蘇紋琪、石明玉.
 全能的天才畫家- 李奧納多‧達文西 (西元1452年-1519年) 指導老師:袁淑芬老師 製作人:饒佩芯.
Ch02 視窗Swing套件 物件導向系統實務.
程式設計實作.
第5章 面向对象程序设计 本章要点 5.1 面向对象程序设计概述 5.2 Java语言的面向对象程序设计 5.3 方法的使用和对象数组
遞迴演算法.
Ch07 Java Applets 物件導向系統實務.
2018/11/20 第一章 Java概述 武汉大学计算机学院计算机应用系 2018/11/20 14:33.
Chapter 9 設計的精細製作: 行動計算 Software Engineering – An Engineering Approach, James F. Peters & Witold Pedrycz.
Java 程式設計 講師:FrankLin.
王豐緒 銘傳大學資訊工程學系 問題:JAVA 物件檔輸出入.
Java语言程序设计 第八部分 Applet小程序.
辅导课程十三.
檔案與磁碟的基本介紹.
3.1 数据类型 3.2 标识符与关键字 3.3 常量 3.4 变量 3.5 运算符与表达式 3.6 一个编程实例
認識我的故鄉_台中市.
JAVA 程式設計與資料結構 第四章 陣列、字串與數學物件.
Ch02-基礎語法.
CH04 視窗中元件排排坐 物件導向系統實務.
C/C++/Java 哪些值不是头等程序对象
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
第一單元 建立java 程式.
Ch20. 計算器 (Mac 版本).
The discipline of algorithms 有關演算法的一門學科
數學遊戲一 河內塔 (Tower of Hanoi)
精忠报国  演唱:屠洪纲 作词:陈涛 作曲:张宏光  狼烟起 江山北望  龙起卷 马长嘶 剑气如霜  心似黄河水茫茫  二十年 纵横间 谁能相抗  恨欲狂 长刀所向  多少手足忠魂埋骨它乡  何惜百死报家国  忍叹惜 更无语 血泪满眶  马蹄南去 人北望  人北望 草青黄 尘飞扬  我愿守土复开疆  堂堂中国要让四方来贺.
河內之塔(Towers of Hanoi)問題
Java程式初體驗大綱 大綱 在學程式之前及本書常用名詞解釋 Hello Java!程式 在Dos下編譯、執行程式
Class & Object 靜宜大學資工系 蔡奇偉副教授 ©2011.
第 5 章 遞迴.
第二章 Java语法基础.
樂樂請假了 尊重的故事 資料來源:臺北縣國民小學品德教育手冊 故事來源:臺北縣國民小學品德教育手冊 網路小故事
聽聽那冷雨---重點摘要 二愛 王煜榕.
辅导课程十一.
第二章 Java基本语法 讲师:复凡.
進階UI元件:ListView元件以及複選 靜宜大學資管系 楊子青
Chapter 6 遞迴.
第2章 Java语言基础.
What is “this”? 在物件導向程式設計中,類別的定義就是在說明如果創建了“這個物件”的話,它會具有那些屬性與功能,以及這些功能是如何實現的。 而所謂的“這個物件”就以 this 來表示。 當我們在JavaScript與jQuery中寫 script 程式(函式)時,“誰”呼叫這個函式,這個“誰”就是該函式中所謂的.
古蹟知性之旅 我和新港奉天宮有個約 報告人:陳 映 竹 傅 湘 甯.
All Sources Shortest Path The Floyd-Warshall Algorithm
遞迴
Summary
InputStreamReader Console Scanner
Presentation transcript:

河內之塔(Towers of Hanoi)問題(1/11) 河內之塔(Towers of Hanoi)問題是一個古老而有趣的問題,由法國數學家Eduard Lucas在十九世紀所創,河內之塔的名稱來自以下的傳說: 在越南河內市的市郊有一座寺廟,這廟中有三支金子做成的柱子,其中一根柱子上疊著64個大小不同圓盤,如下圖所示:

河內之塔(Towers of Hanoi)問題(2/11) 這些圓盤可以在三根柱子中移動,但是要遵守以下之規則: 每次只能移動一個圓盤 大圓盤不可以疊在小圓盤上面 這廟裡的出家人都很認真的在研究著怎麼移動圓盤,因為傳說若能將柱子中的所有圓盤都移動到另外一支柱子上時,則世界大同之日(原Eduard Lucas之說法為世界末日)則會來臨,當然,廟裡的出家人都希望世界大同之日能夠趕快來臨。不過,經過數學家的推算,即使這些出家人能夠以一秒鐘一個圓盤的速度來移動這些圓盤,仍然需要264-1秒,約為5千億年才能搬完這些圓盤,而世界大同之日才會來臨。 以下,我們先來看一個簡化的河內之塔的例子。在此例子中,我們只考慮3個圓盤,以下我們顯示如何在7個步驟內將圓盤由某支柱子搬動到另外一支柱子。

河內之塔(Towers of Hanoi)問題(3/11)

河內之塔(Towers of Hanoi)問題(4/11)

河內之塔(Towers of Hanoi)問題(5/11) 河內之塔的問題看似複雜,但是我們若能夠使用遞迴的方式來設計演算法,則此問題會變得較容易解決。其基本想法為將問題簡化為相同但問題大小較小之問題,直到問題能夠直接解決為止。在本例中,所謂問題大小就是「圓盤總數」,而當圓盤總數為1,則我們可以直接將這個圓盤由其所在的柱子直接移動到另外一支柱子來解決問題。以下是以遞迴方式所設計的「河內之塔」演算法:

Towers of Hanoi(河內之塔) 移動A柱的n-1個disk到B柱 移動A柱剩下的最大disk到C柱 移動B柱的n-1個disk到C柱

河內之塔(Towers of Hanoi)問題(6/11) 以下是以遞迴的「河內之塔」演算法撰寫成的Java範例程式:

河內之塔(Towers of Hanoi)問題(7/11) 範例程式(檔名:河內之塔.java) //檔名:河內之塔測試.java //說明:以遞迴方式解決河內之塔(Towers of Hanoi)問題 import javax.swing.*; public class 河內之塔測試 extends JApplet { String 顯示字串; public void init( ) { String 輸入字串; 輸入字串=JOptionPane.showInputDialog("請輸入河內之塔(Towers of Hanoi)圓盤個數"); int 個數=Integer.parseInt(輸入字串); 顯示字串=(個數+"個圓盤河內之塔(Towers of Hanoi)圓盤之移動順序:");

河內之塔(Towers of Hanoi)問題(8/11) 河內之塔(個數,'A','B','C'); //A,B,C分別為「來源柱」、「中間柱」及「目的柱」的代號 JOptionPane.showMessageDialog(null,顯示字串); } //方法:init() 定義區塊結束 private void 河內之塔(int n, char 來源柱, char 中間柱, char 目的柱) { //n代表圓盤個數 if (n==1) 顯示字串+= ("\n圓盤1自柱"+來源柱+"到柱"+目的柱); else { 河內之塔(n-1,來源柱,目的柱,中間柱);//將n-1個圓盤藉由目的柱由來源柱移動至中間柱 顯示字串+= ("\n圓盤"+n+"自柱"+來源柱+"到柱"+目的柱); //將最大的圓盤直接由來源 柱移動至目的柱 河內之塔(n-1,中間柱,來源柱,目的柱);//將n-1個圓盤藉由來源注由中間柱移動至目的柱 } } //方法: 河內之塔() 定義區塊結束 } //類別:河內之塔測試 定義區塊結束

河內之塔(Towers of Hanoi)問題(9/11) 網頁檔案(檔名:河內之塔測試.html) <html> <h1>「河內之塔測試」執行中<h1> <applet code="河內之塔測試.class" width=350 height=100> </applet> </html> 執行結果(以瀏覽器載入檔案:河內之塔測試.html)

河內之塔(Towers of Hanoi)問題(10/11) 我們一開始介紹河內之塔問題時提到,即使以一秒鐘一個圓盤的速度來移動64個圓盤,仍然需要264-1秒(約5千億年)才能搬完這些圓盤,以下我們來看看這個時間是如何推導出來的。 我們來分析圓盤需要移動的次數: 假設Hn為移動n個圓盤所需的移動次數,我們可得

河內之塔(Towers of Hanoi)問題(11/11)

Towers of Hanoi(河內之塔) Disk 1 from A to C Disk 2 from A to B Disk 1 from C to B Disk 3 from A to C Disk 1 from B to A Disk 2 from B to C