斐波纳契封闭了

Bul*_*ula 11 closures fibonacci go

我正在他们的官方网站上进行巡回演出,我被要求写一个斐波纳契发电机.这里是:

 package main

import "fmt"

// fibonacci is a function that returns
// a function that returns an int.
func fibonacci() func() int {
    first := 0
    second := 0
    return func() int{
        if(first == 0) {
         first = 1
         second = 1
         return 0
        }else {
            current := first   
            firstc := second
            second = first + second
            first = firstc
            return current
        }



    }
}

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

有用.但是我觉得它非常难看,我确信必须有更好的解决方案.我一直在考虑在代码审查中发布这个,但是因为我要求更好的方法,我认为这是发布它的正确位置.

有没有更好的方法来编写这段代码?

这是任务:

实现一个fibonacci函数,它返回一个返回连续斐波那契数的函数(一个闭包).

jos*_*hlf 38

我最喜欢的实现迭代斐波那契数字的干净方法是使用firstf i - 1secondf i.Fibonacci方程表明:

f i + 1 = f i + f i - 1

除非我们在代码中写这个,在下一轮我们正在递增i.所以我们有效地做了:

f next i = f current i + f current i - 1

f next i - 1 = f current i - 1

我喜欢在代码中实现这个的方式是:

first, second = second, first + second
Run Code Online (Sandbox Code Playgroud)

first = second部分对应于更新f next i-1 = f current i-1,并且该second = first + second部分对应于更新f next i = f current i + f current i-1.

然后我们剩下要做的就是返回first的旧值,所以在进行更新之前我们会将它存储在临时变量中.总的来说,我们得到:

// fibonacci returns a function that returns
// successive fibonacci numbers from each
// successive call
func fibonacci() func() int {
    first, second := 0, 1
    return func() int {
        ret := first
        first, second = second, first+second
        return ret
    }
}
Run Code Online (Sandbox Code Playgroud)

Go Playground上观看它.


小智 6

另一种方法

func fibonacci() func() int {
    n1, n := -1, 1
    return func() int {
        n1, n = n, n1+n
        return n
    }
}
Run Code Online (Sandbox Code Playgroud)

围棋游乐场


cou*_*015 6

一个小技巧

package main

import "fmt"

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

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


Ste*_*erg 5

我将利用多重赋值,减少标识符的长度,并删除 if 语句:

func fibonacci() func() int {
    var a, b int
    b = 1
    return func() int {
        ret := a
        a, b = b, a+b
        return ret
    }
}
Run Code Online (Sandbox Code Playgroud)