收敛系列函数的最大调用堆栈大小超出错误

Eli*_*zio 0 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;
  }
}
Run Code Online (Sandbox Code Playgroud)

我期待cnvg()回来相当于Math.PI/Math.sqrt(12)(见下面的图片),但我不断得到"超出最大调用堆栈大小"错误.我认为它可能是迭代次数,所以我把1000引用放到了100当时10最后1,但我似乎仍然收到错误.

在此输入图像描述

从理论上讲,一旦marker倒数到0并执行最后一个循环,它应该停止并返回值sum,但这似乎不是这样的情况......任何人都可以告诉我我做错了什么?

提前致谢.

aar*_*ron 5

marker永远不会被赋值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;
  }
}
Run Code Online (Sandbox Code Playgroud)

但那给了我3 + Math.PI/Math.sqrt(12)...(3.9068996821171087)

marker--检查执行减法,从而产生额外的术语marker = -1.使用--marker> 0,或更清楚:

marker = (typeof(marker) === 'undefined') ? 1000 : marker - 1;
if (marker >= 0) {
    // ...
Run Code Online (Sandbox Code Playgroud)