试图在Python中找出一个递归计数程序

时间:2011-04-20 19:59:08

标签: python recursion counting

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 

所以这个程序接受一个给定的字符串,并计算一个子字符串在其中显示的次数。因此,给定目标'banana'并键'an',函数将吐出2.

我对它如何做到这一点很困惑。 x!= 1是否使得程序只返回x不等于1?我假设countSubStringMatchRecursive结尾处的+1 ......作为回报,它在某种程度上是在计数。

4 个答案:

答案 0 :(得分: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")

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

我承认我对python知之甚少,但这很容易。

这就是最后一行。

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

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

因此,函数的最后一次递归返回零(false),前一次递归返回一次(true),另一次返回之前返回两次(true + 1),依此类推。

这听起来有点令人困惑,但这是我能找到回答你问题的最好方法。