递归函数,用于标识字符串1是否包含在字符串2中? (Python 3.4)

时间:2016-05-14 04:39:50

标签: python string recursion

有没有办法编写递归(必需)函数,该函数将两个字符串作为参数,如果第一个字符串中的所有字符都可以在第二个字符串中按顺序找到,则返回True;否则会错误?

例如:

>>> contains("lit", "litter")
True
>>> contains("thot", "thurtle")
False
>>> contains("ratchet", "ramtbunchiousest")
True
>>> contains("shade", "hadsazie")
False

字母不需要是连续的(如第三个例子中所示),但它们需要按顺序排列(这就是第四个例子失败的原因)。

我写了这段代码:

def contains_recursive(s1, s2):

if s1 == "":
    return True
elif s1[0] == s2[0]:
    return contains_recursive(s1[1:], s2[1:])
elif s1[0] != s2[0]:
    return contains_recursive(s1[0], s2[1:])
else:
    return False

return contains_recursive(s1, s2) == True

它发出了这个错误:

IndexError: string index out of range

我该怎么做才能解决问题?

4 个答案:

答案 0 :(得分:2)

在这一行:

 return contains_recursive(s1[0], s2[1:])

你正在将s1缩短为一个角色,但是在下次通话时你可能会命中:

 return contains_recursive(s1[1:], s2[1:])

s1是一个len 1的字符串。

您需要使用:

return contains_recursive(s1, s2[1:])

并添加一个s1长度的检查

答案 1 :(得分:1)

我认为递归是一项要求。在那种情况下:

db.runCommand({"aggregate": "saleCalculation", "pipeline" : [
        { "$match": {"processingInfo.modifiedDate": { "$gt":ISODate("2010-03-26T18:40:59.000Z"), "$lt":ISODate("2016-09-28T18:40:59.000Z")}}},
        { 
            "$project" : { 
                "header.documentCode": 1, 
                "header.transactionDate": 1, 
                "header.metadata.entityName": 1, 
                "lines" : 1 
            }
        },
        { "$unwind": "$lines"},
        { "$unwind": "$lines.calculatedTax.details" }
    ]
})

这会产生:

def contains(s1, s2):
    if not s1:
        return True
    i = s2.find(s1[0])
    if i == -1:
        return False
    else:
        return contains(s1[1:], s2[i+1:])

答案 2 :(得分:1)

您获得的错误可能是因为s2是一个空字符串。还要检查它的长度。如果你达到这一点,就意味着你找不到你要搜索的所有字母,因此最终结果应该是假的。

if s2 == '':
    return False

答案 3 :(得分:0)

避免使用rescurive函数来提高效率。

def test(s1, s2):
    idx2 = 0
    for c in s1:
        if c in s2[idx2:]:
            idx2 = s2.index(c) + 1
        else:
            return False

    return True

# Test
lists = [   ("lit", "litter"), 
            ("thot", "thurtle"), 
            ("ratchet", "ramtbunchiousest"), 
            ("shade", "hadsazie")]

result = [test(*t) for t in lists]
print(result)
# Output
[True, False, True, False]