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

时间:2019-06-14 20:41:39

标签: 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 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

我在做什么错?

3 个答案:

答案 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);
    }
 }