如何使这个Fibonacci序列生成器更优雅?

时间:2017-05-29 12:42:38

标签: go

package main

import "fmt"

func fib_seq() func() int {
    n0, n1 := 0, 1

    return func() int {
        result := n0
        n0, n1 = n1, n0 + n1
        return result
    }
}

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

这是我的Fibonacci序列生成器。 result的定义是不需要的(但必要的)。

我想知道在x, y = y, x + y之后有办法执行return吗?

4 个答案:

答案 0 :(得分:3)

您可能需要查看defer

func fib_seq() func() int {
    n0, n1 := 0, 1

    return func() int {
        defer func() {
            n0, n1 = n1, n0 + n1
        }()

        return n0
    }
}

答案 1 :(得分:2)

命名返回。但你拥有的东西已经足够可读了。

func fib_seq() func() int {
    n0, n1 := 0, 1

    return func() (r int) {
        r, n0, n1 = n0, n1, n0 + n1
        return
    }
}

答案 2 :(得分:0)

就个人而言,我更喜欢以下(为了便于阅读):

type fib struct{ n0, n1 int }

func (f *fib) next() int {
    defer func() { 
        f.n0, f.n1 = f.n1, f.n0+f.n1 
    }()
    return f.n0
}

func main() {
    fib := &fib{0, 1}
    for i := 0; i < 10; i++ {
        fmt.Println(fib.next())
    }
}

答案 3 :(得分:0)

“优雅”对不同的人意味着不同的东西。对某些人来说,这可能意味着“简洁”,对其他人来说,这可能意味着“简单”或“可读性”。

以下是我的看法:

public class Fibonacci {

    private static int x;
    private static int y;
    private static int z;

    public static void main(String[] args) {
        x = 0;
        y = 1;
        z = 0;

        System.out.println(x);
        System.out.println(y);
        while (z < 100) {
            z = x + y;
            System.out.println(z);
            x = y;
            y = z;
        }

    }
}

正如你所看到的,我赞成可读性而不是复杂性:)