斐波那契负数

negative number in fibonacci

如果我在输出中检查我的代码是否有 6 这样的数字,我得到的 8 是正确的。如果我有 99 那么我得到负数。这段代码有什么问题:

package main

import (
"fmt"
)

var num = 94

func main() {
  fmt.Printf("%d\n", fibo(num))
}

func fibo(num int) int{
  a, b := 0, 1
  for i := 0; i < num; i++ {
    a, b = b, a + b
  }
  return a
}

尝试将 fibo 函数的 return 类型从 int 修改为 uint64 并将 ab 声明为 uint64,与 int 输出一样,它会溢出,这就是你得到负值的原因:

func fibo(num int) uint64{
  var a, b uint64 = 0, 1
  for i := 0; i < num; i++ {
    a, b = b, a + b
  }
  return a
}

但是离完美的解决方案还有很远的距离,索引高于93的元素会发生溢出。

更新:适用于任意大数。

所以使用 Go 的 big 包你可以获得一个有效的 fibo 函数(至少看起来是这样)。

也试试这个:

package main


import (
"fmt"
"math/big"
)


var num int = 94

func main() {
  fmt.Printf("%d\n", fibo(num))
}

func fibo(num int) *big.Int{
  var a, b, t *big.Int = big.NewInt(0), big.NewInt(1), big.NewInt(0)

  for i := 0; i < num; i++ {
    t.Set(a)

    a.Set(b)
    b.Add(b, t)

  }
  return a
}

对于fibo(94)它将输出:

19740274219868223167

这似乎是合法的 Python 我用相同的逻辑得到相同的结果。

希望对您有所帮助!