章節連結
從網路課程 程式必修課!離散數學與演算法 來淺嚐一下沒機會在課堂上所學的離散數學與演算法。或許對撰寫程式的效能提昇會有些幫助。
課程相關資訊
[連結]:https://hiskio.com/courses/1196/lectures/133759
本篇範圍:Chapter 6
請注意:本系列文章為個人對應課程的消化吸收後,所整理出來的內容。換言之,並不一定會包含全部的課程內容,也有可能會添加其他資源來說明。
內容
Hanoi Tower
有三根圓環,且有不同直徑的圓盤。一開始會在某一根柱子上,會由小到大來擺放,目的是要將所有的盤子移到最後一根柱子上,且同樣遵循由小到大來擺放。過程中,一次只能移動一個盤子,且同樣要遵循由小到大的規則。
總共的步數,會是 2 ^ n – 1 步
Coding
function hanoi (n,a,b,c) :n 代表總數;a,b,c 代表柱子
1. 如果 n === 1,將 a 的內容 pop,然後填入 c
2. 如果 n !== 1,那就是:
2-1:將 n-1 個元素從 a 移到 b : hanoi (n-1,a,c,b) ,可想成將 b,c 兩根柱子暫時互換
2-2:將 1 個元素從 a 移到 c:hanoi (1,a,b,c)
2-3:將 n-1 個元素從 b 移到 c:hanoi (n-1,b,a,c)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
function hanoi(n,a,b,c){ console.log('processing:',a,b,c) if(n === 1){ c.push(a.pop()) }else{ hanoi(n-1,a,c,b) hanoi(1,a,b,c) hanoi(n-1,b,a,c) } } let arr1 = [5,4,3,2,1] let arr2 = [] let arr3 = [] hanoi(5,arr1,arr2,arr3) console.log('------------') console.log(arr1) console.log(arr2) console.log(arr3) |