[英]Python - Recursive Functions
下面是我要執行的代碼:遞歸地解析一個字符串,該字符串的長度可以是1或2個字符。
def recur_parse(s,pattern):
result = False
print(s[0],s[0:2],result)
if s[0]==pattern or s[0:2]==pattern:
print('Condition Satisfied')
return True
elif len(s[1:]) >= len(pattern):
print('Calling the function recurisively with params',s[1:],pattern)
recur_parse(s[1:],pattern)
else:
return False
期望遞歸調用應返回True,但返回False。 我做錯什么了嗎?
相同的測試用例執行如下:
情況1:
recur_parse('ximibi','xi')
('x', 'xi', False)
Condition Satisfied
=> True
情況2:
recur_parse('ximibi','im')
('x', 'xi', False)
('Calling the function recurisively with params', 'imibi', 'im')
('i', 'im', False)
Condition Satisfied
它實際上並不返回False
,但在遞歸情況下返回None
。 同樣,它始終打印(不再使用)變量result
的初始值False
。 要解決此問題,只需在遞歸調用之前添加return
語句。
def recur_parse(s, pattern):
if s[0] == pattern or s[0:2] == pattern:
return True
elif len(s[1:]) >= len(pattern):
return recur_parse(s[1:], pattern)
else:
return False
您還可以將函數簡化為單個更復雜的return
語句(盡管是否更簡單肯定是個人喜好問題)。
def recur_parse(s, pattern):
return s[0] == pattern or s[0:2] == pattern \
or len(s[1:]) >= len(pattern) and recur_parse(s[1:],pattern)
第二種情況不是返回False
,而是返回None
因為您沒有返回對recur_parse
的遞歸調用的結果。 將您的代碼與以下功能進行比較:
def recur_parse(s, pattern):
if s[0] == pattern or s[0:2] == pattern:
return True
elif len(s[1:]) >= len(pattern):
return recur_parse(s[1:], pattern) # notice the return here
else:
return False
但是,這僅適用於長度為1或2的模式。可以使用str.startswith
進行擴展。
def has_string(s, m):
return s.startswith(m) or bool(s) and has_string(s[1:], m)
請注意,此處bool(s)
是基本情況。 這是否可讀性高於我的薪水等級。
如果這不是遞歸的實踐,則需要使用:
def has_string(s, m):
return m in s
def recur_parse(s,pattern):
if (len(s) < len(pattern)):
return False
if (s[0:len(pattern)] == pattern):
return True
return recur_parse(s[1:],pattern)
進行了更改,因此更加健壯:應該使用n長度的模式。
Result
變量不執行任何操作 遞歸語句的第一部分檢查以下幾種情況:明確地知道 String有效還是無效。 最后,遞歸步驟假定兩個邊緣情況失敗,因此請重試直到一個通過。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.