Javascript 超过最大调用堆栈大小聚合系列函数出错
我试图用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)(请参见下图)等效的值,但我一直收到“超出最
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我很欣赏你的坚持,但简单地说,选择另一个答案是因为它提供了我没有考虑过的方法的背景,并且更符合我的目标结果。谢谢你的提问。