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