Go怎么快速地计算斐波纳契递归?

时间:2018-02-10 20:29:12

标签: recursion go

这不是它的正确版本,我只是围绕围棋玩,但我很惊讶Go计算斐波纳契序列中的第42个(实际上是43个)数字。

有人可以解释一下它如何快速计算出来吗?我尝试将它与python进行比较(我知道它与其他语言比较慢)但是python采取了> 1分钟,我不得不打破递归。

package main

import "fmt"

func fib(a uint) uint {
    if a <= 1 {
        return 1
    }
    return fib(a-1) + fib(a-2)
}

func main() {
    fmt.Println(fib(42))
}


[ `go run Hello.go` | done: 2.316821835s ]
433494437

1 个答案:

答案 0 :(得分:1)

它的编译器不如C语言那么聪明或成熟(至少现在还没有),但Go的时间性能仍然比C更接近C(空间性能是一个单独的东西,而不是你问的问题)。仅仅是一种编译语言而不是解释语言使它在时间性能上优于Python(并且它仍然比PyPy更快,但速度不快)。

为什么编译语言通常提供比其他地方完全覆盖的解释语言更大的时间性能。您可以在stackoverflow和互联网上的其他地方研究这个问题。例如,这里的问题是one stackoverflow answer中的TL; DR:

  

本机程序使用为其运行的处理器编写的指令运行。

这里是TL; DR another answer

  

解释语言较慢,因为它们的方法,对象和全局变量空间模型是动态的

如果您正在寻找它们,您还可以找到大量基准案例研究和结果,比较不同语言的实现。

经常对Go编译器和Go工具链进行性能改进,您可以在发布说明(和其他地方)中阅读,例如this excerpt about version 1.8

  

新的后端基于静态单一赋值形式(SSA),可生成更紧凑,更高效的代码,并为优化提供更好的平台,例如边界检查消除。新的后端在32位ARM系统上将我们的基准程序所需的CPU时间减少了20-30%。