Javascript 超过最大调用堆栈大小聚合系列函数出错

Javascript 超过最大调用堆栈大小聚合系列函数出错,javascript,math,recursion,Javascript,Math,Recursion,我试图用JavaScript编写一个特定的收敛级数函数: function cnvg(sum,marker){ if((marker--||1000)>=0){ return cnvg(sum=(sum||0) + 1/Math.pow(-3,marker)/(2*marker+1), marker) } else { return sum; } } 我期望cnvg()返回与Math.PI/Math.sqrt(12)(请参见下图)等效的值,但我一直收到“超出最

我试图用JavaScript编写一个特定的收敛级数函数:

function cnvg(sum,marker){
  if((marker--||1000)>=0){
    return cnvg(sum=(sum||0) + 1/Math.pow(-3,marker)/(2*marker+1), marker)
  } else {
    return sum;
  }
}
我期望
cnvg()
返回与
Math.PI/Math.sqrt(12)
(请参见下图)等效的值,但我一直收到“超出最大调用堆栈大小”错误。我认为这可能是迭代次数,所以我将
1000
引用从
100
删除,然后是
10
,最后是
1
,但我似乎仍然收到了错误

理论上,一旦
标记
倒计时到0并执行最后一个循环,它应该停止并返回
总和
的值,但情况似乎并非如此。。。谁能告诉我我做错了什么


提前感谢。

标记
从未在
cnvg()
中赋值,导致无限递归。你是说:

function cnvg(sum, marker) {
  marker = (typeof(marker) === 'undefined') ? 1000 : marker;
  if (marker-- >= 0) {
    return cnvg(sum=(sum||0) + 1/Math.pow(-3,marker)/(2*marker+1), marker)
  } else {
    return sum;
  }
}
但这给了我3+的Math.PI/Math.sqrt(12)。。。(3.90689968211710087)

marker--
在检查后执行减法运算,产生一个带有
marker=-1
的附加项。使用
--marker
>0
,或更清楚地:

marker = (typeof(marker) === 'undefined') ? 1000 : marker - 1;
if (marker >= 0) {
    // ...

标记
从未在
cnvg()
中赋值,导致无限递归。你是说:

function cnvg(sum, marker) {
  marker = (typeof(marker) === 'undefined') ? 1000 : marker;
  if (marker-- >= 0) {
    return cnvg(sum=(sum||0) + 1/Math.pow(-3,marker)/(2*marker+1), marker)
  } else {
    return sum;
  }
}
但这给了我3+的Math.PI/Math.sqrt(12)。。。(3.90689968211710087)

marker--
在检查后执行减法运算,产生一个带有
marker=-1
的附加项。使用
--marker
>0
,或更清楚地:

marker = (typeof(marker) === 'undefined') ? 1000 : marker - 1;
if (marker >= 0) {
    // ...

默认参数

在古代,我们编写了如下默认参数

function add (x, y) {
  if (x === undefined) x = 0
  if (y === undefined) y = 0
  return x + y
}
function add (x = 0, y = 0) {
  return x + y
}
现在使用ES2015和更高版本,我们可以这样编写它们

function add (x, y) {
  if (x === undefined) x = 0
  if (y === undefined) y = 0
  return x + y
}
function add (x = 0, y = 0) {
  return x + y
}

让事情简单化

递归过程可以简单地写成

const converge=(k=0)=>
k<0
? 0
:converge(k-1)+(Math.pow(-3,-k)/(2*k+1))
console.log(converge(1000))//0.90689968211710091

console.log(Math.PI/Math.sqrt(12))/0.90689968211710089
默认参数

在古代,我们编写了如下默认参数

function add (x, y) {
  if (x === undefined) x = 0
  if (y === undefined) y = 0
  return x + y
}
function add (x = 0, y = 0) {
  return x + y
}
现在使用ES2015和更高版本,我们可以这样编写它们

function add (x, y) {
  if (x === undefined) x = 0
  if (y === undefined) y = 0
  return x + y
}
function add (x = 0, y = 0) {
  return x + y
}

让事情简单化

递归过程可以简单地写成

const converge=(k=0)=>
k<0
? 0
:converge(k-1)+(Math.pow(-3,-k)/(2*k+1))
console.log(converge(1000))//0.90689968211710091

console.log(Math.PI/Math.sqrt(12))//0.90689968211710089
标记--
问题代码中的标记不递减
标记
?这很接近。。。但是这给了我
3+Math.PI/Math.sqrt(12)
。。。(3.90689968211710087)@Eliseod'Annunzio我可以知道你为什么喜欢另一个答案吗?@aaron我很欣赏你的坚持,但简单地说,选择另一个答案是因为它提供了我没有考虑过的方法的背景,并且更符合我的目标结果。谢谢您的提问。
标记--
在问题的代码中不会减少
标记
?很接近。。。但是这给了我
3+Math.PI/Math.sqrt(12)
。。。(3.90689968211710087)@Eliseod'Annunzio我可以知道你为什么喜欢另一个答案吗?@aaron我很欣赏你的坚持,但简单地说,选择另一个答案是因为它提供了我没有考虑过的方法的背景,并且更符合我的目标结果。谢谢你的提问。