Python - 递归函数

时间:2018-01-11 22:49:53

标签: python

下面是我尝试执行的代码:递归地解析一个字符串,该字符串可以是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

3 个答案:

答案 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长度的模式。

  1. 你应该返回递归函数的结果,这样你就可以知道结果了。
  2. 您的Result变量无效
  3. 你应该检查一下函数开头的长度,以防一个比模式短的字符串传递给
  4. 开始。
  5. 您可以使用return语句的位置删除其中一个条件语句。
  6. 递归语句的第一部分检查边缘情况:显式地知道,表示字符串有效或无效。最后,递归步骤假定两个边缘情况失败,因此再次尝试直到一个传递。