Golang阶乘显示错误结果

huangapple go评论138阅读模式
英文:

Golang Factorial Shows Wrong Result

问题

我已经将一个Python的阶乘函数转换成了一个Go语言程序。Python代码如下:

  1. def main():
  2. n = input('Enter a number')
  3. result = factorial(n)
  4. print(result)
  5. def factorial(n):
  6. if n == 0:
  7. return 1
  8. else:
  9. return n * factorial(n-1)

而Go语言的代码如下:

  1. package main
  2. import "fmt"
  3. func main() {
  4. fmt.Println("Enter a Number ")
  5. var n int64
  6. var result int64
  7. fmt.Scan(&n)
  8. result = factorial(n)
  9. fmt.Println(result)
  10. }
  11. func factorial(n int64) int64 {
  12. if n == 0 {
  13. return int64(1)
  14. }
  15. return int64(n * factorial(n-1))
  16. }

对于小数字,两个程序的结果是相同的。但对于较大的数字,Go语言的输出结果为零。终端的输出如下:

  1. enKats-MacBook-Air:Factorials venkat$ python factorial.py
  2. Enter a number5
  3. 120
  4. VenKats-MacBook-Air:Factorials venkat$ go run factorial.go
  5. Enter a Number
  6. 5
  7. 120
  8. VenKats-MacBook-Air:Factorials venkat$ python factorial.py
  9. Enter a number99
  10. 933262154439441526816992388562667004907159682643816214685929638952175999932299156089414639761565182862536979208272237582511852109168640000000000000000000000
  11. VenKats-MacBook-Air:Factorials venkat$ go run factorial.go
  12. Enter a Number
  13. 99
  14. 0
  15. VenKats-MacBook-Air:Factorials venkat$

对于较大的数字,Go语言程序出现了问题。请问Go语言程序的问题出在哪里?感谢您的帮助。

英文:

I have converted a Python factorial function into a golang program . The Python code is as follows

  1. def main():
  2. n = input('Enter a number')
  3. result = factorial(n)
  4. print(result)
  5. def factorial(n):
  6. if n == 0:
  7. return 1
  8. else:
  9. return n * factorial(n-1)

And the Golang problem is as follows ,

  1. package main
  2. import "fmt"
  3. func main() {
  4. fmt.Println("Enter a Number ")
  5. var n int64
  6. var result int64
  7. fmt.Scan(&n)
  8. result = factorial(n)
  9. fmt.Println(result)
  10. }
  11. func factorial(n int64) int64 {
  12. //fmt.Println(n)
  13. if n == 0 {
  14. return int64(1)
  15. }
  16. //fmt.Println(n * factorial(n-1))
  17. return int64(n * factorial(n-1))
  18. }

The results of both the programs are same for small numbers.But for bigger numbers The Go output is zero. The Terminal output is as follows ,

  1. enKats-MacBook-Air:Factorials venkat$ python factorial.py
  2. Enter a number5
  3. 120
  4. VenKats-MacBook-Air:Factorials venkat$ go run factorial.go
  5. Enter a Number
  6. 5
  7. 120
  8. VenKats-MacBook-Air:Factorials venkat$ python factorial.py
  9. Enter a number99
  10. 933262154439441526816992388562667004907159682643816214685929638952175999932299156089414639761565182862536979208272237582511852109168640000000000000000000000
  11. VenKats-MacBook-Air:Factorials venkat$ go run factorial.go
  12. Enter a Number
  13. 99
  14. 0
  15. VenKats-MacBook-Air:Factorials venkat$

What's wrong with the Go Program for larger numbers? Any help would be appreciated.

答案1

得分: 5

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

  1. >>> import numpy as np
  2. >>> def factorial(n):
  3. ... if n == 0:
  4. ... return np.int64(1)
  5. ... else:
  6. ... return n * factorial(n - np.int64(1))
  7. ...
  8. >>> factorial(99)
  9. __main__:5: RuntimeWarning: overflow encountered in long_scalars
  10. 0

我不是一个 Golang 程序员,但是快速搜索得到了以下标准库的信息:

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

英文:

This is the result of overflow. Vanilla Python ints are arbitrarily sized. But if you use a sized int, e.g. 64 bit-ints using numpy for example, you get the same problem:

  1. >>> import numpy as np
  2. >>> def factorial(n):
  3. ... if n == 0:
  4. ... return np.int64(1)
  5. ... else:
  6. ... return n * factorial(n - np.int64(1))
  7. ...
  8. >>> factorial(99)
  9. __main__:5: RuntimeWarning: overflow encountered in long_scalars
  10. 0

I am not a golang programmer, but a quick search yielded the following from the standard library:

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

huangapple
  • 本文由 发表于 2017年3月12日 11:06:48
  • 转载请务必保留本文链接:https://go.coder-hub.com/42743269.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定