簡體   English   中英

Python-遞歸函數

[英]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長度的模式。

  1. 您應該返回遞歸函數的結果,以便進一步了解結果。
  2. 您的Result變量不執行任何操作
  3. 如果傳遞的字符串比模式開頭的字符串短,您可能應該檢查函數開頭的長度
  4. 您可以使用return語句的位置刪除條件語句之一。

遞歸語句的第一部分檢查以下幾種情況:明確地知道 String有效還是無效。 最后,遞歸步驟假定兩個邊緣情況失敗,因此請重試直到一個通過。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM