看板 Ruby 關於我們 聯絡資訊
這問題不知道在這邊問妥不妥當 如果不適合的話請跟我說 我會把他刪掉 以下是我寫的河內塔程式 可以將每個碟子移動的過程畫出來方便觀察 演算法是參考網路上很多的範例所寫的 可是我對於各碟子移動的規則 還是看不出一個所以然來 是否有人可以幫我解釋一下 或是網路上有更詳細說明可以與我分享 $src = Array.new $tmp = Array.new $des = Array.new $disk = 3 # 組合出橫向的線 def draw_line(q, index, height) _rc = '' i = index - (height - q.size) if(i<0) _rc << ' '*(height-1) << "||" << ' '*(height-1) else _rc << ' '*(height-q[i]) << "=="*(q[i]) << ' '*(height-q[i]) end return _rc end # 畫出目前的狀態 def pirnt_queue puts '' _tower_height = $disk+1 0.upto(_tower_height-1) do |i| _line = '' _line << draw_line($src, i, _tower_height) _line << draw_line($tmp, i, _tower_height) _line << draw_line($des, i, _tower_height) puts _line end end # 移動最上面的碟子 def move_top(q_src, q_des) q_des.insert(0, q_src[0]) q_src.delete_at(0) pirnt_queue end def honai(n, q_src, q_tmp, q_des) if(n==1) move_top(q_src, q_des) return end honai(n-1, q_src, q_des, q_tmp) move_top(q_src, q_des) honai(n-1, q_tmp, q_src, q_des) end def hand_made move_top($src, $des) move_top($src, $tmp) move_top($des, $tmp) move_top($src, $des) move_top($tmp, $src) move_top($tmp, $des) move_top($src, $des) end def main 1.upto($disk){|i|$src.push(i)} pirnt_queue #hand_made honai($disk, $src, $tmp, $des) end if($1==$FILE) main end -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.220.71.34
mars90226:簡單來說,有三個地方可放碟子,大碟子要在小碟子下面 09/20 14:15
mars90226:然後把全部碟子從一個地方一到另一個地方 09/20 14:16
sand1050:正常是畫樹狀 看就很清楚了 09/20 15:47
SansWord:重點在遞迴規則: 09/22 11:44
SansWord:把一個高度為 n 的塔從 A 移動到 C = 09/22 11:45
SansWord:先把高度為 n-1 的塔從 A 移動到 B, 在把最底下那片 09/22 11:45
SansWord:從 A 放到 C, 在把剛剛移動到 B 的 n-1 的塔移動到 C 09/22 11:46
SansWord:收斂條件是當 n 為 1, 則直接把那片移動過去目的地即可 09/22 11:46
SansWord:honai 這個method 就是在形容這件事 09/22 11:47
SansWord:move_top 則是移動一片使用的 method 09/22 11:47
SansWord:這樣懂了嗎 09/22 11:47
SansWord:移動次數上的分析是 hanai(n) = 2 * hanai(n-1) + 1 09/22 11:48
mars90226:樓上小心板規中的推文限制XD 09/23 09:36
godfat:是的,下次請避免推太多,直接回文即可 O_o 09/24 02:35
SansWord:喔抱歉....一推就推過頭.... 09/27 01:20