计算双因子的问题:计算机还是代码?

时间:2017-10-15 16:51:20

标签: python python-3.x performance

我正在使用Python 3编写计算器应用程序,除了我尝试使用my 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))

1 个答案:

答案 0 :(得分: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),但我怀疑你的计算机已达到其极限。

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

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

你可以通过使用xrange代替它,这是一个序列迭代器。