2014年9月10日 星期三

河內塔(漢諾塔)算法解析 The tower of hanoi algorithm analysis

起源(Origin):
       最早發明這個問題的人是法國數學家愛德華·盧卡斯
傳說印度某間寺院有三根柱子,上串64個金盤。寺院裡的僧侶依照一個古老的預言,以上述規則移動這些盤子;預言說當這些盤子移動完畢,世界就會滅亡。這個傳說叫做梵天寺之塔問題(Tower of Brahma puzzle)。但不知道是盧卡斯自創的這個傳說,還是他受他人啟發。
若傳說屬實,僧侶們需要264 − 1步才能完成這個任務;若他們每秒可完成一個盤子的移動,就需要5849億年才能完成。整個宇宙現在也不過137億年。
這個傳說有若干變體:寺院換成修道院僧侶換成修士等等。寺院的地點眾說紛紜,其中一說是位於越南河內,所以被命名為「河內塔」。另外亦有「金盤是創世時所造」、「僧侶們每天移動一盤」之類的背景設定。
佛教中確實有「浮屠」()這種建築;有些浮屠亦遵守上述規則而建。「河內塔」一名可能是由中南半島在殖民時期傳入歐洲的。

來源網址: http://zh.wikipedia.org/wiki/%E6%B1%89%E8%AF%BA%E5%A1%94

這個遊戲有 三個柱子,暫以 A  B  C 代替

目的,要把 A柱上的多個盤子由A 移動到 C 柱
當一個盤子時, A -> C
當二個盤子時, A -> B, A -> C, B -> C

解法重點,只要超過二個盤子,都可以想像只有二個盤子
也就是 n 跟 n-1 個盤子(最低部的盤子跟除了 最底部以外的盤子)

最底部以外的盤子  n - 1 
最低部的盤子為      n

所以只有三個步驟不斷重複

A -> B
A -> C
B -> C

第一步 將 n-1個盤子 A移動到B
第二步 將 最底部盤子n  A移動到B
第三步 將 n-1個盤子 B移動到C

有圖說明觀念才會清楚些



2014年7月2日 星期三

go語言 教學2 條件式If else...switch

func main() {
 for i := 0; i < 20; i++ {
  if i%2 == 0 {
   fmt.Println("even:", i)
  } else {
   fmt.Println("odd:", i)
  }
 }
}
 
 if i%2 == 0
 
golang if 條件式省略了() 無需括號即可做條件判斷

多重條件式

func main() {
 scores := []int{30, 50, 60, 80, 70, 90}
 for i := 0; i < len(scores); i++ {
  s := scores[i]
  if s/20 == 5 {
   fmt.Printf("score: %d is S\n", s)
  } else if s/20 == 4 {
   fmt.Printf("score: %d is A\n", s)
  } else if s/20 == 3 {
   fmt.Printf("score: %d is B\n", s)
  } else if s/20 == 2 {
   fmt.Printf("score: %d is C\n", s)
  } else {
   fmt.Printf("score: %d is D\n", s)
  }
 }
}

go語言 教學1 基礎

go 語言被譽為這個世代的C語言,其精神也繼承了c語言的優點,少即多,沒有太多花俏的特性,所用到的關鍵字只有二十五個,跟c語言31個、c++89個比較,顯得相當精簡。並行機制也使得go語言,編寫多線程及網路編程都相當容易!
go語言主要為系統及網路編程而設計, 一些設計要求較為嚴格。導入的模組及聲明的變數,未使用無法通過編譯,go精簡的特性,也導致少了一些新穎好用的特性,如函數式語言的列表推導。
>>> [ x for x in range(20) if x % 2]
[1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
 基本語法

go保留了c語言風格,為讓早已熟悉c style的人,減少學習成本,因此語言跟c很相像

package main

import (
 "fmt"
)

func main() {
 fmt.Println("Hello World!")
}
 
函數聲明關鍵字func 跟c 一樣需有main()函數做為程式進入點。
 
main() 表示程式一被執行時,就會被執行的位置
採用了大括號{} 做為程式縮排判定
正確 
func main() {
 fmt.Println("Hello World!")
}
錯誤 
func main()
{ 
 fmt.Println("Hello World!")
} 
golang 編譯時會統一格式輸出
編輯器存檔時,也會調用golang的format,做語法編排修正
因此在golang上難以看到五花八門的寫法

2014年1月16日 星期四

Python & Java 數字金字塔解法

問題:讓電腦列印數字金字塔
            1
         1 2 1
      1 2 4 2 1
    1 2 4 8 4 2 1
 1 2 4 8 16 8 4 2 1