答案 0 :(得分:0)
递归的基本思想是在函数内部调用它。
function strLen(str,cnt) {
cnt = cnt || 0;
if (str.length) {
return strLen(str.substr(1), ++cnt);
} else {
return cnt;
}
}
console.log(strLen("asdf"));
console.log(strLen("1234567890"));
如果你想以蹦床的方式进行训练,那基本上是一回事,只是返回一个函数而不是调用它。
function trampoline(f) {
while(f && typeof f === "function") {
f = f();
}
return f;
}
function strLen(str, cnt) {
cnt = cnt || 0;
if (str.length) {
return strLen.bind(this, str.substr(1), ++cnt);
} else {
return cnt;
}
}
console.log(trampoline(strLen("TEST")));
console.log(trampoline(strLen.bind(null, "1234567890")))
答案 1 :(得分:-1)
也许是这样的?
strLength = 0;
for (var i = 0; i < string.length; i++){
strLength++;
}
编辑:
这是我想到的新解决方案:
function stringLength(string)
parts = string.split("");
stringLength = 0;
for (x in parts){
stringLength++;
}
console.log(stringLength("Hello"))
编辑#2:
运行代码后,我意识到了这个问题。你给我的函数为字符串的每个长度运行一次,这意味着调用堆栈填满了所有函数调用。此链接解释了更多:Maximum call stack size exceeded error
我上面提供的函数可以很好地处理超过一百万个字符的字符串。 Javascript确实受到浏览器的限制,因此浏览器对执行代码的限制会严重限制超过一定长度的性能。
简而言之,您想要的方式永远不会对长度超过几十个字符的字符串起作用。我的方式虽然可能不是最高效的,但是可以处理长度超过一百万的字符串,没有问题。