3

私はGo言語が初めてで、次のコードと混同しました

package main

import "fmt"

// fibonacci is a function that returns
// a function that returns an int.
func fibonacci() func() int {
    previous := 0
    current := 1
    return func () int{
        current = current+previous
        previous = current-previous
        return current

    }
}

func main() {
    f := fibonacci
    for i := 0; i < 10; i++ {
        fmt.Println(f()())
    }
}

このコードは、フィボナッチ数列 (最初の 10) を出力することになっていますが、10 回 1 しか出力しません。しかし、コードを次のように変更すると:

func main() {
    f := fibonacci()
    for i := 0; i < 10; i++ {
        fmt.Println(f())
    }
}

その後、正常に動作しています。出力はフィボナッチ数列です。

これを説明するのを手伝ってくれる人はいますか?

ありがとう

4

3 に答える 3

1

func fibonacci() func() intリスト内で最後に生成された数値を表すを返す関数リテラル(クロージャ) を返します。int

最初の main() メソッド

f := fibonacci
    for i := 0; i < 10; i++ {
        fmt.Println(f()())
    }

fジェネレーター関数であり、新しい環境( 、 、f()()で新しいクロージャーを生成するループ呼び出しのすべての反復。2 番目の呼び出しは、常に等しい を返します。previous := 0current := 1), socurrent1

2 番目の main() メソッド

func main() {
    f := fibonacci()
    for i := 0; i < 10; i++ {
        fmt.Println(f())
    }
}

f初期環境( , := 1)を持つクロージャー(ジェネレーターではない) であり、ループ呼び出しのすべての反復は環境を返し、変更するため、次の呼び出しではandになります。previous := 0currentf()currentprevious1current 2

于 2013-10-08T23:59:52.403 に答える