RecursionError:超出了maxium递归深度

时间:2016-01-22 01:59:05

标签: python

我是新堆栈溢出这是我的第二个问题所以请耐心等待。我正在创建一个简单的计算器程序。这是代码:

def add(x, y):
    return x + y

def subtract(x, y):
    return x - y

def multiply(x, y):
    return x * y

def divide(x, y):
    return x / y

print("what do you want to do?")
print("1.Add:")
print("2.Subtract:")
print("3.Multiply:")
print("4.Divide:")

choice = input("Enter a number 1-4 for your operation: ")

def operation():
    if choice == '1':
        print(num1,"+",num2,"=", add(num1, num2))

    elif choice == '2':
        print(num1,"-",num2,"=", subtract(num1, num2))

    elif choice == '3':
        print(num1,"*",num2,"=", multiply(num1, num2))

    elif choice == '4':
        print(num1,"/",num2,"=", divide(num1, num2))
    else:
        print("I SAID A NUMBER 1-4 YOU DUMBASS!")
        return(operation(), input())

operation()
num1 = int(input("Enter a number: "))
num2 = int(input("Enter another one: "))

每当我输入大于5的数字时,它使用else语句并反复循环print语句几秒钟然后打印"递归错误:超出最大递归深度。我知道通过将return语句放在函数中,函数会反复循环。然后我尝试添加输入以提示用户输入另一个输入,但我想这不是正确的语法。有人可以为此代码发布正确的语法,还是有更简洁的方法来执行此操作?谢谢你的任何帮助表示赞赏。

3 个答案:

答案 0 :(得分:3)

问题出在你的else条款中:

else:
    print("I SAID A NUMBER 1-4 YOU DUMBASS!")
    return(operation(), input())

请注意,您再次致电operation,但您根本没有更改choice,因此operation将以之前的相同选择再次运行(过去和直到你达到递归限制。)

此时,您可能很想做:

choice = input(...)
return operation()

但是,由于choice是一个全局变量而无法正常工作,如果您尝试在函数中修改它,那么您将获得UnboundLocalError

您可以在global choice内声明operation,但这不是最理想的。更好的设计是将选择作为参数传递给operation

choice = int(input("Enter a number 1-4 for your operation: "))

def operation(choice):
    if choice == 1:
        print(num1,"+",num2,"=", add(num1, num2))

    elif choice == 2:
        print(num1,"-",num2,"=", subtract(num1, num2))

    elif choice == 3:
        print(num1,"*",num2,"=", multiply(num1, num2))

    elif choice == 4:
        print(num1,"/",num2,"=", divide(num1, num2))
    else:
        print("I SAID A NUMBER 1-4 YOU DUMBASS!")
        choice = int(input())
        return operation(choice)

operation(choice)

最后,即使你使这个部分工作,你还会遇到其他问题,具体取决于python2.x或3.x.在python2.x上,input将返回数字,而不是字符串,因此您的相等测试(choice == '1')将永远不会通过。在python3.x上,相等测试会很好(因为你的选择将是一个字符串),但数学方程式会破坏(你不能将2个字符串相乘)。

我在上面的示例中修复过 - 但请记住不要在python2.x的生产代码中使用input,因为它存在巨大的安全风险。

答案 1 :(得分:0)

该呼叫在输入之前,因此它正在呼叫并再次呼叫和呼叫。带有选项的菜单通常放在while循环中。

答案 2 :(得分:0)

你的代码中有两个问题,一个是你将一个字符串与整数进行比较而另一个是没有改变你调用相同函数的选项值,所以它一直在调用自己永远不会结束,所以编译器给你递归错误。