Javascript 递归中的闭包
我有两个javascript递归函数。 第一个函数按从右到左的顺序返回输入数字的位数 第二个函数按从左到右的顺序返回它们Javascript 递归中的闭包,javascript,recursion,scope,closures,Javascript,Recursion,Scope,Closures,我有两个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 &g
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
第二个函数的结果是
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;
}
此功能按预期工作。这个问题实际上与闭包本身无关,但它是由引起的。
将其与JS处理递归函数的方式结合起来,您就可以得到简单明了的输出 JS还没有真正的递归调用堆栈。上次我检查时,递归调用被有效地短路了(~=goto)。我记得读过Douglas Crockford关于这个主题的文章,关于它与调用堆栈有关。
虽然ES5的严格模式确实引入了TCO,而且应该在2013年底实现(ES6-Harmony)。我已经链接到了几个网站,如果你想了解更多关于这个问题的内容,很简单:你使用的是隐含的globals:
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;
}
此功能按预期工作。这个问题实际上与闭包本身无关,但它是由引起的。
将其与JS处理递归函数的方式结合起来,您就可以得到简单明了的输出 JS还没有真正的递归调用堆栈。上次我检查时,递归调用被有效地短路了(~=goto)。我记得读过Douglas Crockford关于这个主题的文章,关于它与调用堆栈有关。
虽然ES5的严格模式确实引入了TCO,而且应该在2013年底实现(ES6-Harmony)。如果你想了解更多关于这件事的信息,我已经链接到几个网站@jangofett:不客气,尽管如此,感谢某人帮助你的方式是投票/接受答案,而不是发布感谢-comment@jangofett当前位置不客气,但在这种情况下,感谢某人帮助你的方式是投票/接受答案,在内部函数变量之前使用“var”。在内部函数变量之前使用“var”。