繁体   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