gpt4 book ai didi

javascript - 递归中的闭包

转载 作者:行者123 更新时间:2023-11-28 20:23:30 25 4
gpt4 key购买 nike

我在 JavaScript 中有这两个递归函数。第一个函数按从右到左的顺序返回输入数字的数字第二个函数按从左到右的顺序返回它们。

function first(n){
if(n > 0){
m = Math.floor( n/10 );
v = ( n - m * 10 ) + " " + first(m);
return v;
}
return "";
}



function second(n){
if(n > 0){
m = Math.floor( n/10 );
v = second(m) + " " + ( n - m * 10 );
return v;
}
return "";
}

第一个函数的结果是

7 6 1 

第二个函数的结果是

1 16 167

但我预料到了

1 6 7 

我在 PHP 和 JAVA 中测试了类似的代码,效果很好。据推测问题出在 Javascript 的闭包中。但我不知道如何解决它。

最佳答案

这非常简单:您正在使用隐含的全局变量:

function second(n)
{
if(n > 0)
{
m = Math.floor( n/10 );
//m is changing here ------\\will use lowest value of m
v = second(m) + " " + ( n - m * 10 );
return v;
}
return "";
}

修复方法是:

function second(n)
{
if(n > 0)
{
//make declare it in the scope itself
var m = Math.floor( n/10 );
v = second(m) + " " + ( n - m * 10 );
return v;
}
return "";
}

这仍然给您留下了邪恶隐含的全局v。如果我是你,我也会在本地声明 v

function second(n)
{
var m, v = '';
n = +(n);//coerce to number
if (n > 0)
{
m = Math.floor(n/10);
v = second(m) + ' '+ (n-m*10);
}
return v;
}

此功能按预期工作。
这个问题实际上与闭包无关,但它是由 the way JS resolves expressions/names 引起的。 .
将其与 JS 处理递归函数的方式结合起来,您就可以得到简单明了的输出。

JS 还没有真正的递归调用堆栈。上次我检查时,递归调用实际上被短路了(〜= goto)。我记得读过 Douglas Crockford 写的关于这个主题的一些内容,关于它与调用堆栈有关。
尽管 ES5 的严格模式确实引入了 TCO,并且应该会在 2013 年底实现(ES6 - Harmony)。我链接到了几个网站 here ,如果您愿意阅读有关此事的更多信息

关于javascript - 递归中的闭包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17829369/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com