Golang利用select和普通函式分別實現斐波那契數列

OldBoy~發表於2018-09-22
//斐波那契數列
//1 1 2 3 5 8
//觀察規律
//第一輪:前兩個數是1,1,相加等於2
//第二輪:第二個數和第三個數是1,2,相加等於3
//第三輪:第三個數和第四個數是2,3,相加等於5
//第四輪:第四個數和第五個數是3,5,相加等於8
//也就是說兩個數相加的和,和前面的數相加

package main

import (
    "fmt"
)

//ch只寫,quit只讀
func fibonacci(ch chan<- int, quit <-chan bool) {
    x, y := 1, 1
    for {
        //監聽channel資料的流動
        select {
        case ch <- x: //往裡寫 。第一次寫的時候是1,如果沒有地方讀的話,那麼這裡會阻塞
            x, y = y, x+y //第一次是往ch寫1,y的值也是1,下一次y的值就是x+y
        case flag := <-quit:  //
            fmt.Println("flag = ", flag)
            return
        }
    }
}

func main() {
    ch := make(chan int)    //數字通道
    quit := make(chan bool) //程式是否結束

    //消費者,從channel讀取內容
    //新建協程
    go func() {
        for i := 0; i < 8; i++ {
            num := <-ch      //這裡讀是因為防止select那裡會阻塞
            fmt.Println(num)
        }
        //可以停止
        quit <- true
    }() //別忘了()

    //生產者,產生數字,寫入channel
    fibonacci(ch, quit)

}
1
1
2
3
5
8
13
21
flag =  true

上面是使用select,下面用普通函式實現

package main

import (
    "fmt"
)

func Fibonacci() func() int {
    a, b := 0, 1
    return func() int {
        a, b = b, a+b
        return a
    }
}

func main() {

    f := Fibonacci()
    fmt.Println(f())
    fmt.Println(f())
    fmt.Println(f())
    fmt.Println(f())
    fmt.Println(f())
    fmt.Println(f())
    fmt.Println(f())
    fmt.Println(f())
    fmt.Println(f())
    fmt.Println(f())
}
1
1
2
3
5
8
13
21
34
55

 

相關文章