Javascript - >递归地查找字符串中的子字符串

时间:2014-01-28 05:25:18

标签: javascript string recursion

我正在尝试编写一个递归程序来计算子字符串(“cat”)出现在字符串中的次数(“catdogcowcat”)。不确定我做错了什么,但我一直收到以下错误:

TypeError: Cannot read property 'length' of undefined

这是我的代码:

function strCount (str, sub) {
    var subLen = sub.length;
    var strLen = str.length;
    if (strLen < subLen) {
        return 0;
    } else if (str.slice(0, subLen) === sub) {
        return 1 + strCount(str.substring(subLen));
    } else return strCount(str.substring(1));
}

我认为当我尝试在这一行上获取子字符串的长度时,它正在破碎,但这只是基于我对devtools调试的幼稚理解的猜测:

return 1 + strCount(str.substring(subLen));

谢谢!

4 个答案:

答案 0 :(得分:4)

您的strCount函数需要2个参数,因此请确保在递归调用时传递sub

function strCount (str, sub) {
    var subLen = sub.length;
    var strLen = str.length;
    if (strLen < subLen) {
        return 0;
    } else if (str.slice(0, subLen) === sub) {
        return 1 + strCount(str.substring(subLen), sub);
    } else return strCount(str.substring(1), sub);
}

答案 1 :(得分:0)

您可以使用正则表达式,而不是必须执行递归函数

function strCount(needle,haystack){
   var r = new RegExp(needle,"g");
   var r2 = haystack.match(r);
   return (r2?r2.length:0);
}

console.log( strCount("cat","catdowcowcat") );

答案 2 :(得分:0)

你需要为sub ..传递值。

 function strCount(str, sub) {                
            var subLen = sub.length;
            var strLen = str.length;
            if (strLen < subLen) {
                return 0;
            } else if (str.slice(0, subLen) === sub) {
                return 1 + strCount(str.substring(subLen),sub);
            } else
                return strCount(str.substring(1),sub);
        }

你可以调用方法

 $(document).ready(function(){
               alert(strCount("catdogcowcat","cat"));
            });

它会将结果返回为2。 小提琴 http://jsfiddle.net/deepaksuresh3003/RDmby/

答案 3 :(得分:0)

您正在调用自己的方法 strCount(str.substring(subLen))而不提供第二个参数,因此该函数将'sub'参数视为未定义。

按如下方式更新您的代码,它将开始工作:

 function strCount(str, sub) {
        var subLen = sub.length;
        var strLen = str.length;
        if (strLen < subLen) {
            return 0;
        } else if (str.slice(0, subLen) === sub) {
            return 1 + strCount(str.substring(subLen), sub);
        } else return strCount(str.substring(1),sub);
    }