我使用遞回回圈來查找由一個字母變化形成的單詞之間的路徑。例如:
人-->切割
- 男人
- 能夠
- 貓
- 切
遞回函式使用while查看單詞的單字母鄰居,并找到與目標單詞最相似的鄰居。然后使用那個詞,它會更深,比起始詞和目標詞之間的字母差異多兩個深度。(這對于大多數情況來說似乎就足夠了,盡管證明這是另一回事)
問題是我的遞回函式給我帶來了麻煩。起初我只是嘗試使用“中斷”,但遞回會繼續運行。因此,我在這里搜索了解決該問題的方法。為了節省您閱讀我制作的所有類和函式的時間,我創建了一個產生相同錯誤的精簡版本。
def recurse(c):
try:
while c>0:
print(c)
c-=1
if c==5:
raise StopIteration
recurse(c-1)
except StopIteration:
print("We found the word. Stop the recursion.")
recurse(12)
如果您運行此代碼,則會多次引發例外,并且遞回不會停止。我在這里的另一篇文章中閱讀了有關使用例外來停止其軌道中的遞回的方法,但使用情況有點不同。
我是否錯誤地實施了這一點?
uj5u.com熱心網友回復:
您遇到的問題是 while break(或您在回圈外但在同一函式內捕獲的例外)只能跳出單個回圈,而不是遞回呼叫堆疊中存在的整個回圈鏈。
您輸入答案的代碼的第二個版本有效,因為例外從所有遞回函式中中斷,因為這就是例外通過呼叫堆疊冒泡的方式。缺點是您需要在頂層捕獲例外(輔助函式可能會更優雅地為您執行此操作)。
但是另一種設計方法是稍微改變遞回。您可以回傳一個指示成功或失敗的值,而不是回傳失敗(例如未找到解決方案)或引發例外(將在頂層捕獲),并檢查該值以查看是否可以保留在函式中回圈和/或遞回。
嘗試類似:
def recurse(c):
while c>0:
print(c)
c-=1
if c==5:
return True
result = recurse(c-1)
if result:
return result
return False
我注意到這個特定的遞回函式沒有多大意義,因為回圈和遞回都在操縱相同的c值,但這可能是您簡化問題的產物,并且這兩種流控制機制在您的實際問題中更有意義。
uj5u.com熱心網友回復:
我想我想要“停止”的不是“while”而是遞回的最初呼叫,它開始了所有的麻煩。所以我意識到這是解決方案:
def recurse(c):
while c>0:
print(c)
c-=1
if c==5:
raise StopIteration
recurse(c-1)
try:
recurse(12)
except StopIteration:
print("Stop the recursion I want to get off.")
我很高興它現在可以正常作業,只需寫下這個問題就可以幫助我解決自己的問題。雖然,我懷疑它不是最優雅的孤子。例如,我選擇那個錯誤代碼是因為它“聽起來不錯”——它在這里被正確使用了嗎?
uj5u.com熱心網友回復:
您可以使用 break 陳述句而不是例外
https://www.tutorialspoint.com/python/python_break_statement.htm
def recurse(c):
while c>0:
print(c)
c-=1
if c==5:
break
recurse(c-1)
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/520623.html
標籤:Python递归例外
