說不清楚的閉包
閉包的概念大家都聽說過,但是往往解釋的越多,越說不明白。今天我用GoLang的課後斐波那契數列的練習題來秒說明一下閉包的套路。記住:一切都是套路。 斐波那契數列
斐波那契數列是一種數列,它的規律是數列中某一個位置的數字是該位置的前兩個位置的數字之和。
比如,指定兩個起始數字,比如0和1,那麼斐波那契數列就會像這樣:0, 1, 1, 2, 3, 5, 8, 13。。。 先上代碼
package mainimport "fmt"// 單純的兩個數字相加的函數func add(x, y int) int { return x + y}// fibonacci 函數會返回一個返回 int 的函數。func fibonacci(s1, s2 int) func() int { fmt.Println("fibonacci start with ", s1, " and ", s2) // 套路3: 初始化需要記憶住的變數left和right,這部分只會被調用一次 left := s1 right := s2 return func() int { // 這部分開始會被調用多次,只要外部調用方調用一次f函數,這裡就會被執行一次 next := add(left, right) // 套路4: 更新需要記憶住的變數left和right left = right right = next // 套路5: 返回每一次f被調用的結果 return next }}func main() { // 套路1: 調用一次閉包函數來得到f函數,又可稱為閉包函數的初始化 f := fibonacci(0, 1) for i := 0; i < 10; i++ { // 套路2: 反覆不斷的調用f得到結果 fmt.Println("next value: ", f()) }}
把代碼拷貝到fibonacci.go檔案中,然後運行go run fibonacci.go看結果吧。
以下是運行結果:
fibonacci start with 0 and 1
next value: 1
next value: 2
next value: 3
next value: 5
next value: 8
next value: 13
next value: 21
next value: 34
next value: 55
next value: 89 閉包的調用理念
1,會被外界調用一次來初始化
2,返回一個函數f給調用方
3,調用方接下去只要重複調用f就可以達到目的 閉包的編程套路
1, 在閉包函數中且在返回函數的體外,定義每下一次計算需要記憶的變數,如left和right
2,在返回函數的體中去實現對於記憶變數的每次更新
3,在返回函數的體中返回調用方希望得到的結果 總結
整個流程和機器學習裡面的神經網路的RNN演算法非常類似,如果有RNN背景的同學會非常快的理解。