运行简单的递归函数时最大调用堆栈大小错误

时间:2018-11-14 16:05:20

标签: javascript

我对JavaScript编程还很陌生,但是我有很多其他编程语言的经验。 JavaScript中的递归函数的想法对我来说是一个新鲜的话题,在我使用的其他语言中,我看不到任何类似的东西。因此,为了练习起见,我决定编写一些已经用“ for循环”编写的程序。

其中一个程序是一个函数,该函数将字符串作为参数并报告其中有多少个B字母。使用面向对象的编程,我首先声明了一个函数,该函数可以找到字符串中任何其他字符的数量。程序如下,

function countChar(string, char) {
  let counted = 0;
  for (let index = 0; index < string.length; index++) {
    if (string[index].toUpperCase() == char.toUpperCase()) {
      counted += 1;
    }
  }
  return counted;
}

function countBs(text) {
  return countChar(text, 'B');
}

console.log(countBs('Baby'));
// output = 2

它工作得很好,但是现在我正在使用递归函数,因此出现“最大调用堆栈大小”错误。我的带有递归函数的程序看起来像这样,

function countChar(string, char) {
  function cursor(i, counted) {
    if (i == string.length) {
      return counted;
    } else if (string[i].toUpperCase() == char.toUpperCase()) {
      return cursor(i++, counted++);
    } else {
      return cursor(i++, counted);
    }
  }
  return cursor(0,0);
}

function countBs(text) {
  return countChar(text, 'B');
}

console.log(countBs('Baby'));
// output must be 2 but I get 'Maximum call stack size' error instead :(

任何人都可以对此程序进行修改以获得解决方案吗?基本上可以使用递归函数编写该程序吗?

1 个答案:

答案 0 :(得分:4)

因为

 return cursor(i++, counted++);

必须是

 return cursor(i + 1, counted + 1);

(因为要增加递归传递的值,而不是局部变量i)


我该怎么做:

 const countBs = (str, i = 0) => 
    i >= str.length
      ? 0
      : countBs(str, i + 1) + (str[i].toUpperCase() === "B");

或者如果您打算将其用于非常长的字符串,请考虑使用TCO:

 function countBs(str, i = 0, count = 0) {
   if(i >= str.length) return count;
   return countBs(str, i + 1, count + (str[i].toUpperCase === "B"));
}