python - Golang 阶乘显示错误的结果

标签 python go

我已将 Python 阶乘函数转换为 golang 程序。 Python代码如下

def  main():
    n = input('Enter a number')
    result = factorial(n)
    print(result)

def factorial(n):
    if n == 0:
        return 1
    else:
        return n * factorial(n-1)

而Golang问题如下,

package main

import "fmt"

func main() {
    fmt.Println("Enter a Number ")
    var n int64
    var result int64
    fmt.Scan(&n)
    result = factorial(n)
    fmt.Println(result)
}

func factorial(n int64) int64 {
    //fmt.Println(n)
    if n == 0 {
        return int64(1)
    }
    //fmt.Println(n * factorial(n-1))
    return int64(n * factorial(n-1))

}

对于小数,两个程序的结果相同。但对于更大的数,Go 输出为零。终端输出如下,

enKats-MacBook-Air:Factorials venkat$ python factorial.py
Enter a number5
120
VenKats-MacBook-Air:Factorials venkat$ go run factorial.go
Enter a Number 
5
120
VenKats-MacBook-Air:Factorials venkat$ python factorial.py
Enter a number99
933262154439441526816992388562667004907159682643816214685929638952175999932299156089414639761565182862536979208272237582511852109168640000000000000000000000
VenKats-MacBook-Air:Factorials venkat$ go run factorial.go
Enter a Number 
99
0
VenKats-MacBook-Air:Factorials venkat$ 

对于更大的数字,Go 程序有什么问题?任何帮助将不胜感激。

最佳答案

这是溢出的结果。 Vanilla Python int 的大小是任意的。但是如果你使用一个大小的 int,例如例如,使用 numpy 的 64 位整数,你会遇到同样的问题:

>>> import numpy as np
>>> def factorial(n):
...   if n == 0:
...     return np.int64(1)
...   else:
...     return n * factorial(n - np.int64(1))
...
>>> factorial(99)
__main__:5: RuntimeWarning: overflow encountered in long_scalars
0

我不是 golang 程序员,但快速搜索从标准库中得到以下内容:

https://golang.org/pkg/math/big/

关于python - Golang 阶乘显示错误的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42743269/

相关文章:

python - 使用 WTForms 和 Flask 预填充编辑表单

python - "other"在 python 中是什么意思?

go - 如何在golang中将 slice 附加到字节数组

去循环 channel ,但缺少索引

performance - Golang slice 追加 vs 分配性能

从 go 调用 C 函数

python - LD_LIBRARY_PATH 优先级和编译问题

python - 有什么方法可以将 Python 的 matplotlib 中的图形导入 Matlab?

python - 执行添加列并根据 Pandas 中的其他列填充它们的函数

go - GUI 未运行 - 未在 DLL 中找到入口点