JavaScript:编写一个函数,该函数接受一个输入字符,并使用递归返回该字符重复5次

JavaScript:编写一个函数,该函数接受一个输入字符,并使用递归返回该字符重复5次,javascript,function,recursion,arguments,repeat,Javascript,Function,Recursion,Arguments,Repeat,编写一个函数,该函数接受一个输入字符,并使用递归返回该字符重复5次。例如,如果输入是“g”,那么输出应该是“ggggg” 我尝试了下面的代码: function repeater(char) { let newStr = ''; if (newStr.length === 5){ return newStr; } else { newStr += char; } return repeater(char); } // To check i

编写一个函数,该函数接受一个输入字符,并使用递归返回该字符重复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:超过最大调用堆栈大小


我做错了什么

Cause
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"

注意:上述函数不会返回5次重复。这是留给你的练习:)

如果我们把作业放在一边,你可以只做“g”。重复(5)


CharStyle:
=3
是一个所谓的“默认参数”。这意味着
repeat(“g”)
等于
repeat(“g”,3)
。其优点是,您可以对不同的长度重复使用它,
repeat(“g”,10)
将重复g 10次


²:这是一个尾声。如果将递归调用放在最后一行并返回它,引擎可以将递归优化到循环中,这会更快,并且不会达到最大调用堆栈大小(无限递归仍然是不好的,请尽量避免陷入其中。
newStr.length===5
例如是危险的,因为长度为6的字符串将永远运行。因此我建议使用
=
代码中的一件事是在其他条件之外调用repeater,这意味着它将被无限调用。Se条件是您正在函数中声明newStr。您可能需要执行类似的操作

function repeater(char, oldStr) {
    let newStr = oldStr || '';
    if (newStr.length === 5) {
        return newStr;
    } else {
        newStr += char;
        return repeater(char, newStr);
    }
 }

您可以采用默认值
5
,并调用递归,直到不再有可用的调用为止

函数中继器(字符,计数=5){
如果(!count)返回“”;//退出条件
return char+repeater(char,count-1);//重复部分
}

console.log(repeater('x');
什么时候
newStr.length==5
会是真的?它总是一个空列表,因为它设置在那一行。你是说
char.length==5
?如果你尝试添加
console.log()
或其他类型的关键点代码跟踪,打印变量的当前值并指示所做的决定。每次调用repeater函数时,都会实例化一个新的let变量newStr。返回意味着内存问题,因为它被调用了无限次。如果从我原来的co运行console.logde…我认为您的代码为第二个控制台返回了错误的输出。log@PineNuts0我明白你的意思。那是因为我没有重新初始化newStr。我修改了代码以接受第二个参数,它将包含上一次迭代的结果。如果没有第二个参数,它将以空字符串开始。@JonasWilms,yes和no,因为退出条件检查的不是剩余计数,而是no count。也就是说,如果使用count zero调用函数,则不会得到任何字符,与示例相反,返回的字符为零,在我看来,这不是预期的(如果不使用第二个参数,则可能不可能).在我的例子中,第二个参数可以与零一起使用。
function repeater(char, oldStr) {
    let newStr = oldStr || '';
    if (newStr.length === 5) {
        return newStr;
    } else {
        newStr += char;
        return repeater(char, newStr);
    }
 }