0
def countSubStringMatchRecursive(target,key):
    """Counts how many times key is in string(string,key)"""
    x=find(target,key)
    print x
    return x!=-1 and countSubStringMatchRecursive(target[x+1:],key)+1 

所以这个程序接受一个给定的字符串并计算一个子字符串在其中出现的次数。因此,给定目标“香蕉”和键“an”,该函数将输出 2。

我有点困惑它是如何做到这一点的。x!=1 是否使程序只返回 x 不等于 1?我假设 countSubStringMatchRecursive... 末尾的 +1 以某种方式计数。

4

4 回答 4

2

正如 jhwist 所说,String.find返回匹配的最低索引。因此,只有在实际找到子字符串时才会发生递归(否则 String.find 返回 -1)。

这是一种非常低效的方法。Python 支持这个功能,它被称为str.count(sub[, start[, end]]). 记录在这里:http ://docs.python.org/library/stdtypes.html#str.count 。

所以而不是

countSubStringMatchRecursive("test test test test", "test")

你会用

"test test test test".count("test")
于 2011-04-20T20:06:21.487 回答
1

x 是找到的子字符串的位置索引。如果为 -1,则未找到,因此该方法返回 0。

换句话说,它是简短的,并且不评估第二个条件(例如,它不进行递归调用)。否则,它使用找到的子字符串的位置加一递归调用自己(这样我们可以找到下一个子字符串,如果它存在)并将结果加 1。

于 2011-04-20T20:02:36.007 回答
0

String.find返回匹配的最低索引。因此,只有在实际找到子字符串时才会发生递归(否则 String.find 返回 -1)。

于 2011-04-20T20:02:45.820 回答
0

我承认我对 python 了解不多,但这很容易。

诀窍是最后一行。

“return”首先检查 x 是否不是 -1,这意味着该函数的当前递归在“target”中没有找到额外的“key”,在这种情况下,不会评估“and”之后的子句并且该函数将向调用函数返回“false”(零)。

但是,如果“x”确实不是 -1,则条件的第二部分(在“and”之后)将被评估,并且该语句所做的是调用函数本身,但它发送当前评估的“目标”的子字符串",在 "x" 之后开始一个字符(当前递归中 "target" 中 "key" 的位置)。然后它将函数返回的值加一并返回总和。

因此,函数的最后一次递归返回零(假),前一个返回一(真),前一个返回二(真 + 1),依此类推。

这听起来可能有点令人困惑,但这是我能找到回答您问题的最佳方式。

于 2011-04-20T20:25:43.123 回答