從前從前,在越南有個地方叫做河內,河內有座山,山上有座塔,塔中有三根聳天而立的大銀棒,銀棒上串有64 個金盤。塔中的僧侶們會依照一個古老的預言,並依規則每天移動一次金盤;而預言則說當這些金盤全部都移動完畢之後,世界就會毀滅......
這個問題“據說”是每個學習程式語言的人一生必解一次的問題,就是著名的河內塔問題。河內塔一開始由64個大小不相等的盤子由下往上依序為大到小排列,並且在移動的時候要遵守這幾個既定的規則:
注意!這是一系列的題組問題
這些題目主要是用來引導大家一步一步做出最後的成果,如果你對自己有自省想要挑戰自我的話,可以直接跳到最後一題的結果去實作。
第一題:撰寫輸入河內塔層數的函數
請撰寫一個名為readTowerAmount
的函數,呼叫時會顯示提示請輸入河內塔層數:
,輸入數字會回傳輸入數字的整數型態。如果輸入的不是數字,會拋出帶有輸入的層數應該要是整數。
訊息的IllegalArgumentException
第二題:撰寫輸入“棒子”名稱的函數
請撰寫一個名為readStickNames
的函數,呼叫時會顯示提示請依序輸入三隻棒子的名字,中間用","隔開:
,輸入正確格式的字串會回傳一個長度為3的List<String>
。如果輸入的格式不正確,會拋出帶有必須輸入三個名字,中間用","隔開。
訊息的IllegalArgumentException
第三題:撰寫輸入格式輸出字串的函數
步驟格式輸出字串
請撰寫一個名為readMoveRingFormatString
的函數,呼叫時會顯示提示請輸入步驟輸出的格式字串(必須包含%1$d、%2$s、%3$s):
,輸入正確格式的字串會回傳輸入字串。如果輸入的格式不正確,會拋出帶有格式輸出字串必須恰好包含包含%1$d、%2$s、%3$s。
訊息的IllegalArgumentException
移動總次數格式輸出字串
請撰寫一個名為readTotalFormatString
的函數,呼叫時會顯示提示請輸入移動次數總計輸出的格式字串(必須恰好包含一個%d):
,輸入正確格式的字串會回傳輸入字串。如果輸入的格式不正確,會拋出帶有格式輸出字串必須恰好包含一個%d。
訊息的IllegalArgumentException
第四題:撰寫河內塔函數
請撰寫可以印出河內塔完整步驟與回傳總步數的函數,並與第一題的函數配合輸入,產生下列執行結果:
成功
請輸入河內塔層數:3
ring 1: 0 -> 1
ring 2: 0 -> 2
ring 1: 1 -> 2
ring 3: 0 -> 1
ring 1: 2 -> 0
ring 2: 2 -> 1
ring 1: 0 -> 1
總共7步
失敗
請輸入河內塔層數:4.4
輸入的層數應該要是整數。
第五題:自定義棒子名稱
請修改河內塔函數,並與第二題的函數配合,自定義棒子的名稱:
成功
請輸入河內塔層數:3
請依序輸入三隻棒子的名字,中間用","隔開:A,B,C
ring 1: A -> B
ring 2: A -> C
ring 1: B -> C
ring 3: A -> B
ring 1: C -> A
ring 2: C -> B
ring 1: A -> B
總共7步
失敗
請輸入河內塔層數:4.4
輸入的層數應該要是整數。
==============================
請依序輸入三隻棒子的名字,中間用","隔開:A,B
必須輸入三個名字,中間用","隔開。
第六題:使用格式化輸出
請修改河內塔函數,並與第三題的函數配合,自行輸入格式化字串:
成功
請輸入河內塔層數:3
請依序輸入三隻棒子的名字,中間用","隔開:台北,台中,高雄
請輸入步驟輸出的格式字串(必須包含%1$d、%2$s、%3$s):將第%1$d層金盤從%2$s移動到%3$s
請輸入移動次數總計輸出的格式字串(必須包含一個%d):總共移動金盤%d次
將第1層金盤從台北移動到高雄
將第2層金盤從台北移動到台中
將第1層金盤從高雄移動到台中
將第3層金盤從台北移動到高雄
將第1層金盤從台中移動到台北
將第2層金盤從台中移動到高雄
將第1層金盤從台北移動到高雄
總共移動7次
失敗
請輸入河內塔層數:4.4
輸入的層數應該要是整數。
==============================
請依序輸入三隻棒子的名字,中間用","隔開:A,B
必須輸入三個名字,中間用","隔開。
==============================
請輸入步驟輸出的格式字串(必須包含%1$d、%2$s、%3$s):將第%d層金盤從%s移動到%s
格式輸出字串必須必須包含%1$d、%2$s、%3$s。
==============================
請輸入移動次數總計輸出的格式字串(必須恰好包含一個%d):總共移動金盤%d%d次
格式輸出字串必須恰好包含一個%d。