2014-01-28 4 views
2

Я пытаюсь написать рекурсивную программу, чтобы подсчитать количество раз, когда подстрока («cat») появляется в строке («catdogcowcat»). Не уверен, что я делаю неправильно, но я получаю следующее сообщение об ошибке:Javascript -> Рекурсивно найти подстроку в строке

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

Ваш 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); 
} 
+0

К сожалению, не должны пропустить это. Благодаря! –

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

вам нужно передать значение для суб ..

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 Fiddle http://jsfiddle.net/deepaksuresh3003/RDmby/

0

вы вызываете свой собственный метод strCount (str.substring (subLen)) без предоставления второго параметра и, следовательно, функция принимает параметр «sub» как 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), sub); 
     } else return strCount(str.substring(1),sub); 
    } 
Смежные вопросы