编写一个函数,该函数接受输入字符,并使用递归将其重复返回5次。例如,如果输入为“ g”,则输出应为“ ggggg”。
我尝试了以下代码:
function repeater(char) {
let newStr = '';
if (newStr.length === 5){
return newStr;
}
else {
newStr += char;
}
return repeater(char);
}
// To check if you've completed the challenge, uncomment these console.logs!
console.log(repeater('g')); // should return 'ggggg'
//console.log(repeater('j')); 'jjjjj'
我的代码返回:RangeError: Maximum call stack size exceeded
我在做什么错?
答案 0 :(得分:2)
原因newStr
是一个局部变量,未在递归调用中传递。因此,将在每次调用时创建一个新的newStr
,并且其长度始终为0。要解决该问题,请传递字符串或长度:
function repeat(char, result = "") {
if(result.length / char.length >= 3) return result;
return repeat(char, result + char); // ²
}
// a call goes like:
// repeat("g", "")
// repeat("g", "g")
// repeat("g", "gg")
// repeat("g", "ggg")
// OR
function repeat(char, count = 3) { /*¹*/
if(count <= 1) return char;
return char + repeat(char, count - 1);
}
// repeat("g", 3)
// "g" + repeat("g", 2)
// "g" + "g" + repeat("g", 1)
// "g" + "g" + "g"
或者这仅适用于给定的一个字符(如任务所述):
function repeat(char) {
if(char.length >= 3) return char;
return repeat(char + char[0]); // ²
}
注意:上面的函数不会返回5次重复。那就是您的一项练习:)
如果我们把任务搁置一旁,尽管可以做"g".repeat(5)
...
¹:= 3
是所谓的“默认参数”。这意味着repeat("g")
等于repeat("g", 3)
。优点是您可以将其重复使用不同的长度,repeat("g", 10)
将重复g 10次。
²:多数民众赞成在打个电话。如果将递归调用放在最后一行并将其返回,则引擎可以将递归优化到循环中,这会更快 并且不会达到最大调用堆栈大小(无限递归仍然很糟糕) ,请尽量避免进入其中。例如,newStr.length === 5
很危险,因为长度为6的字符串将永远运行。因此,我建议使用>=
或<=
(就像我做的那样)上面))。
答案 1 :(得分:1)
您可以采用默认值5
并调用递归,直到没有可用的调用为止。
function repeater(char, count = 5) {
if (!count) return ''; // exit condition
return char + repeater(char, count - 1); // repeating part
}
console.log(repeater('x'));
答案 2 :(得分:0)
代码中的一件事是您在其他条件之外调用中继器,这意味着它将被无限调用。其次是您在函数内部声明了newStr。您可能想要做这样的事情。
function repeater(char, oldStr) {
let newStr = oldStr || '';
if (newStr.length === 5) {
return newStr;
} else {
newStr += char;
return repeater(char, newStr);
}
}