go言語でフィボナッチ数列

タイトルのまんま。 A Tour of GoのExerciseです。

package main

import "fmt"

// fibonacci is a function that returns
// a function that returns an int.
func fibonacci() func() int {
    count := 0
    return func() int {
        count++
        return _fibonacci(count)
    }
}

func _fibonacci(n int) int {
    if n < 2 { return n }
    return _fibonacci(n-1) + _fibonacci(n-2)
}

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

ちなみに以下のような感じだと、_fibonacciが未定義だと怒られる。当たり前か・・・

# undefined: _fibonacciと言われる
func fibonacci() func() int {
    count := 0
    _fibonacci := func(n int) int {
        if n < 2 { return n }
        return _fibonacci(n-1) + _fibonacci(n-2)
    }

    return func() int {
        count++
        return _fibonacci(count)
    }
}