我正在尝试编写一个返回斐波那契数列的第 n 个数字的函数。从返回 int 到 big.Int 时,我遇到了麻烦。
这是普通版本,它只是使用矩阵求幂来找到斐波那契数列的第 n 个数。它工作得很好并返回我想要的值:
func normalFib(n int) int {
if n == 0 || n == 1 {
return n
}
n -= 2
a, b, c := 1, 1, 0
x, y := 1, 1
var evenNum [3]int
var oddNum [2]int
for n > 0 {
if n%2 == 0 {
temp := []int{a*a + b*b, a*b + b*c, b*b + c*c}
a, b, c = temp[0], temp[1], temp[2]
copy(evenNum[:], temp)
n /= 2
} else {
temp := []int{x*a + y*b, x*b + y*c}
x, y = temp[0], temp[1]
copy(oddNum[:], temp)
n--
}
}
return oddNum[0]
}
func main() {
fmt.Println(normalFib(10)) // Outputs 55
}
上述函数的中间值如下所示:
The value of N is currently: 8
The values of a, b, c: 2 1 1
The value of N is currently: 4
The values of a, b, c: 5 3 2
The value of N is currently: 2
The values of a, b, c: 34 21 13
The value of N is currently: 1
The values of x, y: 55 34 // x is correct!
这是 big.Int 版本。由于 big.Add() 和 big.Mul() 函数的工作方式,我尝试使用它
创建三个结果变量 d、e 和 f,它们将为临时数组中的每个值临时存储这些函数的结果。
将 a、b、c 的值设置为切片的值(如果是奇数,则设置为 x、y)
将临时切片复制到其各自的数组(evenNum 或oddNum)。
倚天杖
相关分类