【问题标题】:Issues computing double factorials: computer or code?计算双阶乘的问题:计算机还是代码?
【发布时间】:2018-03-27 05:17:11
【问题描述】:

我正在使用 Python 3 编写一个计算器应用程序,并且一切正常(我认为),除非我尝试使用我的 double_factorial() 函数。如果我输入一个大于 3 的数字,程序不会输出任何内容,并且我的电脑会过热(我使用的是 Macbook Pro,完全定制为尽可能强大)。这要么是直接的计算机问题,要么是由于我的代码有问题而导致的计算机问题。我的代码有什么问题是我作为初学者可能无法发现的吗? (注意:我只发布相关部分):

def add(a,b):
    return(a + b)

def subtract(a,b):
    return(a - b)


def multiply(a,b):
    counter = 0
    for i in range(a):
        counter = add(counter, b)
    return(counter)

def divide(a,b):
    quotient = 0
    while a >= b:
        quotient = add(quotient, 1)
        a = subtract(a,b)
    return (quotient, a)

def factorial(a):
    c = 1
    while a > 1:
        c = multiply(c,a)
        a = subtract(a,1)
    return(c)

def double_factorial(a):
    og = factorial(a)
    return factorial(og)    

def equation():
    d = None    
    print("Valid operations: +, -, *, /, !, !!, =")
    c = eval(input("Integer: "))

    while d != "=":
        d = input("Operation: ")

        if d in ('+', '-', '*', '/', '!', '!!', '='):
            if d == "+":
                c = add(c, eval(input("Integer: ")))
            elif d == "-":
                c = subtract(c, eval(input("Integer: ")))
            elif d == "*":
                c = multiply(c, eval(input("Integer: "))) 
            elif d == "/":
                c = divide(c, eval(input("Integer: ")))
            elif d == "!":
                c = factorial(c)
            elif d == "!!":
                c = double_factorial(c)            
        elif d != "=":
            print("invalid")
    print(str(c))

【问题讨论】:

  • 请贴出multiply()subtract()的函数定义。
  • 请注意,双因子的扩展速度相当快,例如10 的输入将需要 3628800 次 multiply() 调用才能进行第二级计算。
  • 顺便说一句,你不应该使用eval(input(...))。像这样的事情并不是真正的问题,但一般来说,应该避免eval,尤其是在接受输入时,因为it is dangerous。你应该只使用intfloat,因为无论如何这就是你想要的。
  • 一切都已更新!为了方便起见,我只是添加了所有功能。另外,在完成我的代码时,我会牢记 eval 的事情,那篇文章真的很有帮助!

标签: python python-3.x performance


【解决方案1】:

4!! = 24!这是一个巨大的数字(粗略估计:24!> 24 * 5^5 * 10^14,这意味着 4!! ~ 10^20 已经接近 sys.maxsize。

下一个,5!! = 120!这是非常大的。 (120!>> 10^90 * 100^20 ~ 10^130)。

如果您提供乘法函数的代码,它可能有助于检测到底发生了什么(理论上,Python3 可以成功计算例如 10^100),但我怀疑您的计算机已经达到了极限。

更新:既然您已经提供了代码,至少还有一个潜在的问题:在您的乘法方法中,您使用 range(a),它实际上在内存中实例化了请求的序列。假设每个 int 有 4 个字节,这将导致至少需要 a*4 个字节。例如。如果你的机器有例如1TB 可用内存(它可能没有)这已经限制了 a 的值:a

此外,您的“a”是相乘值中较大的一个,因此更改发送到乘法的操作数的顺序也会有所帮助,因为这样范围会更小(对应于 n! 而不是部分计算的 n! !)

您可以通过使用 xrange 来缓解这种情况,它是一个序列迭代器。

【讨论】:

  • 确实如此。我的服务器在 0.8 秒内计算了 8!!,但 9!! 需要 85 秒。与n! 相比,指数增长已经微不足道了。所以你可以忘记n!!
  • 我用程序中的所有功能编辑了我的初始帖子,包括乘法!这是一个循环结构的学习练习,这就是我调用 add() 函数而不是乘法的原因。
  • 在python 3中没有xrange,只有range,但是我的代码在我切换发送到乘法的操作数的顺序后工作,所以谢谢!
  • 正确:stackoverflow.com/questions/15014310/…(我使用 Python2 的方式比纯 Python3 更频繁)
猜你喜欢
  • 2011-04-26
  • 1970-01-01
  • 1970-01-01
  • 2018-10-06
  • 1970-01-01
  • 2022-01-17
  • 1970-01-01
  • 2023-03-22
相关资源
最近更新 更多