2017-09-04 44 views
-1

我確信這一定是我的一個明顯愚蠢的錯誤。但任何人都可以使用遞歸來解釋這個分割代碼有什麼問題。我知道有很多的選擇,但我需要知道什麼是錯這個在python中使用遞歸的分區

def division(a,b): 
    x = 0 
    if a < b: 
     return x 
    else: 
     x += 1 
     return division(a-b,b) 
    return x 

當我做除法(10,2),它給我0作爲輸出

+0

在這種情況下,x必須是全局的。 – pcu

+0

您總是將x設置爲0. – Szabolcs

回答

-1

這可能工作好一點你:

def division(a,b,x=0): 
    if a < b: 
     return x 
    else: 
     x += 1 
     return division(a-b,b,x) 
    return x 

您的每一次函數通過新recusion跑,你將x設置爲0 。這樣,如果沒有指定x,它默認爲0,並且應該像我想要認爲一樣工作。

另外請注意,這不會爲負數的工作,但你可能知道:)

-1

逃生條件是if a < b。這意味着爲了終止這個函數,必須完成這個才能離開遞歸。但是,由於x是在函數的頂部聲明的,因此只在else語句的主體內重新定義但從未返回,函數將始終以值x = 0終止。

您應該設置x = 1 + division(a-b,b)return division(a-b,b) + 1並在最後刪除無法訪問return

def div(a, b, x): 
    if a < b: 
     return x 
    else: 
     x +=1 
     return div(a - b, b, x) 

print(div(130, 10, 0)) 

# 13 
+0

那麼我應該聲明x全局還是有其他選擇? – Ram

+0

將x回饋給自己 - 這需要以x作爲0餵食,這雖然不起作用,但起作用:請參閱上面的編輯 – camoverride

0

你總是局部變量x設置爲0

這時如果股息比除數小你返回x這當然是0

的。另一方面,當股息大於或等於給你增加x通過1除數和執行遞歸以減少的紅利進行呼叫,這當然會導致第一個案例結束,並且您仍然返回一個x,該值爲0

注意:儘管如此,由於您的ifelse分支都包含return,因此無法訪問您的最終return

所以請儘量考慮這個解決方案:

def division(a, b): 
    if a < b: 
     return 0 
    else: 
     return 1 + division(a-b, b) 
-1

隨着全球您可以:

def division(a,b): 
    global x 
    if a < b: return x 
    else: 
     x += 1 
     return division(a-b,b) 

x=0 
print (division(10,2)) 

但你必須設置x調用之前每次到零division