如果可以x從給定的段串列生成給定的序列,該程式應該回傳 True seglist。在找到一種可能的解決方案后,它應該停止。
我嘗試替換和重新定位回傳命令,但總是出現不同的問題。
def valid_sequence(x, seglist):
if x in seglist:
return True
for i in seglist:
if x.startswith(i):
return valid_sequence(x[len(i):], seglist)
return False
這會為序列'abc'和 seglist ['a', 'ab', 'bc', 'c']、['a', 'b', 'c']、 和回傳正確的布林值['ab', 'bc'],但不會為 seglist回傳正確的布林值,['a', 'ab', 'c']因為顯然它正在通過'a'變體但不會成功并在通過 之前停止'ab',它應該如此。
我通過pythontutor運行它,我理解了一些問題,但我無法確定如何解決它們。
我如何撰寫它以便'ab'在采取不成功的路徑后繼續段'a'?也許我也錯過了其他東西,因為我無法理解這個遞回。
這種方式甚至可以遠程實作,還是我必須采取完全不同的方法?
uj5u.com熱心網友回復:
你非常接近這一點。主要問題是您不應該在遞回步驟中立即回傳。請注意,它將False在呼叫它的第一個回圈后回傳。因此,整個函式也將回傳False。
說,你應該只在結果為 True 時回傳:
def valid_sequence(x, seglist):
if x in seglist:
return True
for i in seglist:
if x.startswith(i):
if valid_sequence(x[len(i):], seglist):
return True
return False
這將解決您提到的問題,但還有一個問題要解決。如果x = 'abc'并且seglist = ['ab', 'b', 'c']該函式將正確回傳True. 但它也會回傳Truefor x = 'abbc',x = 'abbbc'依此類推。發生這種情況是因為 'b' 被無限使用。我想這是不希望的行為。為了克服這個問題,我們為新呼叫創建了一個串列副本,并消除了使用過的元素:
import copy
def valid_sequence(x, seglist):
if x in seglist:
return True
for i in seglist:
if x.startswith(i):
newlist = copy.deepcopy(seglist)
newlist.remove(i)
if valid_sequence(x[len(i):], newlist):
return True
return False
uj5u.com熱心網友回復:
正如您已經正確識別的那樣,您的代碼的問題是您的程式過早地回傳 False,在它用盡每個位置的所有可能的字串選擇之前。
特別是,它在運行以下行時回傳 False:
return valid_sequence(x[len(i):], seglist)
如果您考慮一下,程式應該永遠無法在該位置回傳 False,因為它可能尚未完成對seglist. 但是,如果找到完成序列的字串選擇,您確實希望回傳 True。
幸運的是,只需要稍微修改即可解決此問題:在回傳之前檢查回傳的值是否為 True。我在下面包含了修改后的代碼。
def valid_sequence(x, seglist):
if x in seglist:
return True
for i in seglist:
if x.startswith(i):
if valid_sequence(x[len(i):], seglist):
return True
return False
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/371651.html
下一篇:遞回地比較兩個串列
