下面是我尝试执行的代码:递归地解析一个字符串,该字符串可以是1或2个字符长。
add_action( 'woocommerce_after_single_product_summary', 'removing_product_tabs', 2 );
function removing_product_tabs(){
remove_action( 'woocommerce_after_single_product_summary', 'woocommerce_output_product_data_tabs', 10 );
}
期望是递归调用应返回True,但返回False。我做错了吗?
下面的测试用例执行如下:
案例#1:
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
案例#2:
recur_parse('ximibi','xi')
('x', 'xi', False)
Condition Satisfied
=> True
答案 0 :(得分:2)
它并不真正返回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)
答案 1 :(得分:2)
你的第二个案例是没有返回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
答案 2 :(得分:0)
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
变量无效递归语句的第一部分检查边缘情况:显式地知道,表示字符串有效或无效。最后,递归步骤假定两个边缘情况失败,因此再次尝试直到一个传递。