【问题标题】:Javascript -> Recursively find a substring within a stringJavascript -> 递归查找字符串中的子字符串
【发布时间】:2014-02-19 06:37:01
【问题描述】:

我正在尝试编写一个递归程序来计算子字符串(“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));

谢谢!

【问题讨论】:

    标签: javascript string recursion


    【解决方案1】:

    您的 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);
    }
    

    【讨论】:

    • 哎呀,不应该错过的。谢谢!
    【解决方案2】:

    你可以使用正则表达式,匹配而不是递归函数

    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") );
    

    【讨论】:

      【解决方案3】:

      您需要为 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/

      【讨论】:

        【解决方案4】:

        您正在调用自己的方法 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);
            }
        

        【讨论】:

          猜你喜欢
          • 2016-10-02
          • 1970-01-01
          • 2021-12-10
          • 2021-07-27
          • 2021-09-20
          • 2019-03-29
          • 2016-06-07
          • 2015-05-13
          • 2014-05-16
          相关资源
          最近更新 更多