我尝试按照here所述实施快速双斐波纳契算法:
// Fast doubling Fibonacci algorithm
package main
import "fmt"
// (Public) Returns F(n).
func fibonacci(n int) int {
if n < 0 {
panic("Negative arguments not implemented")
}
fst, _ := fib(n)
return fst
}
// (Private) Returns the tuple (F(n), F(n+1)).
func fib(n int) (int, int) {
if n == 0 {
return 0, 1
}
a, b := fib(n / 2)
c := a * (b*2 - a)
d := a*a + b*b
if n%2 == 0 {
return c, d
} else {
return d, c + d
}
}
func main() {
fmt.Println(fibonacci(13))
fmt.Println(fibonacci(14))
}
这适用于小数字;但是,当输入数字变大时,程序返回错误的结果。所以我尝试使用bigInt
包中的math/big
:
// Fast doubling Fibonacci algorithm
package main
import (
"fmt"
"math/big"
)
// (Public) Returns F(n).
func fibonacci(n int) big.Int {
if n < 0 {
panic("Negative arguments not implemented")
}
fst, _ := fib(n)
return fst
}
// (Private) Returns the tuple (F(n), F(n+1)).
func fib(n int) (big.Int, big.Int) {
if n == 0 {
return big.Int(0), big.Int(1)
}
a, b := fib(n / 2)
c := a * (b*2 - a)
d := a*a + b*b
if n%2 == 0 {
return c, d
} else {
return d, c + d
}
}
func main() {
fmt.Println(fibonacci(123))
fmt.Println(fibonacci(124))
}
然而,go build抱怨
cannot convert 0 (type int) to type big.Int
如何缓解这个问题?
答案 0 :(得分:6)
使用 import android.graphics.Typeface;
...
Typeface greek =
Typeface.createFromAsset(getAssets(), "fonts/aisauc.ttf");
mytextfield.setTypeface(greek);
代替big.NewInt()
。 big.Int()
只是类型转换。
您需要查看documentation of big
package
您应该主要使用表单big.Int()
的方法
在调用func (z *T) Binary(x, y *T) *T // z = x op y
方法之后,要将2个参数相乘,您需要提供结果变量。因此,例如,要获得2 * 2的结果,您需要:
Mul
您可以尝试 Go playground
上的示例您还可以创建扩展功能,如:
big.NewInt(0).Mul(big.NewInt(2), big.NewInt(2))
使代码更具可读性:
func Mul(x, y *big.Int) *big.Int {
return big.NewInt(0).Mul(x, y)
}
上试试