2016-01-22 179 views
0

我是新來堆棧溢出這是我的第二個問題,所以請忍受我。我正在創建一個簡單的計算器程序。下面的代碼:遞歸錯誤:超過最大遞歸深度

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

問題是在你的else子句:

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

注意,你再打電話operation,但是你有沒有改變choice可言,所以operation將與您再次收到了同樣的選擇運行(一遍又一遍,直到你遇到遞歸限制)。

在這一點上,你可能想這樣做:

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

但是,這是行不通的無論是作爲choice是一個全局變量,如果你試圖修改它的功能,你」我會得到一個UnboundLocalError

您可以在operation內聲明global choice,但這並不理想。更好的設計是將選擇作爲參數傳遞給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,因爲這是一個巨大的安全風險。

+0

擔任你說的話我現在: –

+0

其他: \t \t打印( 「我說了一些1-4 YOU英國白人!」) \t \t輸入( 「再次輸入您的選擇:」) \t \t回報操作() –

+0

更好的解決方案是循環而不是遞歸。 – Copperfield

0

該呼叫在輸入之前,因此它正在呼叫和呼叫,再次呼叫。這個帶選項的菜單通常放在while循環中。

0

你的代碼有兩個問題,一個是你將一個字符串與整數進行比較,而另一個不改變你調用相同函數的選項的值,所以它一直調用自己永遠不會結束,所以編譯器給你遞歸錯誤。

+0

糟糕忘記標記問題已解決@mgilson處理第一個問題,我或多或少知道第二個,但謝謝你的幫助 –