[英]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.