我確信這一定是我的一個明顯愚蠢的錯誤。但任何人都可以使用遞歸來解釋這個分割代碼有什麼問題。我知道有很多的選擇,但我需要知道什麼是錯這個在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作爲輸出
我確信這一定是我的一個明顯愚蠢的錯誤。但任何人都可以使用遞歸來解釋這個分割代碼有什麼問題。我知道有很多的選擇,但我需要知道什麼是錯這個在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作爲輸出
這可能工作好一點你:
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,並且應該像我想要認爲一樣工作。
另外請注意,這不會爲負數的工作,但你可能知道:)
逃生條件是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
那麼我應該聲明x全局還是有其他選擇? – Ram
將x回饋給自己 - 這需要以x作爲0餵食,這雖然不起作用,但起作用:請參閱上面的編輯 – camoverride
你總是局部變量x
設置爲0
。
這時如果股息比除數小你返回x
這當然是0
的。另一方面,當股息大於或等於給你增加x
通過1
除數和執行遞歸以減少的紅利進行呼叫,這當然會導致第一個案例結束,並且您仍然返回一個x
,該值爲0
。
注意:儘管如此,由於您的if
和else
分支都包含return
,因此無法訪問您的最終return
。
所以請儘量考慮這個解決方案:
def division(a, b):
if a < b:
return 0
else:
return 1 + division(a-b, b)
隨着全球您可以:
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
在這種情況下,x必須是全局的。 – pcu
您總是將x設置爲0. – Szabolcs