我正在嘗試撰寫一個函式,該函式列印將起始數字變為目標數字所涉及的最小步驟數,乘以 2 并減去 1。
但是,我收到錯誤:
RecursionError: maximum recursion depth exceeded in comparison
這是我寫的代碼:
def no_steps(start,target,sofar):
if start == target:
return sofar
elif start < target and start > 0:
no_steps(start*2,target,sofar '*2 ')
no_steps(start-1,target,sofar '-1 ')
print(no_steps(2,6,''))
我可以知道我做錯了什么,代碼有什么問題嗎?
uj5u.com熱心網友回復:
我的解釋是:從 2 ( start) 開始,乘以 2 和減 1 的序列將導致 6 ( target) 的此類操作最少,這意味著并不總是按照這個順序。
一方面,由于缺少正確的回傳陳述句的實作,您有一個遞回概率(這是您在輸出中看到的)。另一方面,也缺少一些邏輯來實作最少的計算步驟。我的組合解決方案(對于遞回和最小步驟數)將是:
def no_steps(start, target, sofar):
if start == target:
return sofar
if 0 < start and 0 < target:
if (target % 2 == 0) and target > start:
return no_steps(start, target // 2, '*2 ' sofar)
else:
return no_steps(start, target 1, '-1 ' sofar)
return sofar
no_steps(1, 6, '')
'*2 *2 -1 *2 '
no_steps(2, 6, '')
'*2 -1 *2 '
no_steps(3, 6, '')
'*2 '
no_steps(4, 6, '')
'-1 *2 '
no_steps(5, 6, '')
'-1 -1 *2 '
no_steps(6, 6, '')
''
no_steps(7, 6, '')
'-1 '
no_steps(2, 17, '')
'*2 -1 *2 -1 *2 -1 *2 -1 '
編輯:根據 PabloRuiz 的回答修復了先前有缺陷的邏輯。
uj5u.com熱心網友回復:
不要對這個問題使用遞回,我想出了一個更好的解決方案來解決這個問題:
def no_steps(start, target, sofar=''):
while target != start:
if target%2 == 0 and target > start:
target //= 2
sofar = '*2' sofar
else:
target =1
sofar = '-1' sofar
print(sofar)
no_steps(2, 17, '')
請注意,它假設目標大于開始,如果不只是將它們的順序更改為這樣。
PD from here是一個不好的答案,但仍然是我發布的第一個:
您需要停止遞回,您可以執行以下操作:
def no_steps(start,target, path='', it=0):
if it < 10 and not reached:
it =1
if start == target:
print(f'REACHED! in {it} iterations with {path}')
elif start < 2*target and start > 0:
no_steps(start*2,target, path=path '*2', it=it)
no_steps(start-1,target, path=path '-2', it=it)
else:
print('Start going beyond target')
no_steps(2,6)
您還可以添加一個臭名昭著的全域變數來阻止其他分支繼續增長,或者只是設計另一個演算法。
uj5u.com熱心網友回復:
您在遞回方面犯了一個常見錯誤,即您假設return它將折疊原始呼叫和回傳某些內容之間的所有呼叫 - 它不會。
假設您為 start = 3 和 target = 6 運行程式。no_steps(start*2,target, path=path '*2', it=it)將回傳最終結果 - 回到 start = 3 呼叫。然后你忽略這個結果并呼叫no_steps(start-1,target, path=path '-2', it=it). 這將依次呼叫您的函式 start = 4 和 1 等等,直到無窮大(或遞回限制,因此錯誤)。一旦你有一些結果,你需要將它一直回傳到原始呼叫。
您的邏輯中的另一個問題是您想檢查所有可能的選項,但無法捕獲像 2->4->3->2->4... 這樣的無限回圈。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/455067.html
