2013-07-24 72 views
0

我在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的关闭中。但我不知道如何解决它。

+0

使用“变种”。 – ElLocoCocoLoco

回答

3

这是完全简单:您使用隐含的全局:

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's)。我记得Douglas Crockford在这个主题上读到了一些关于它与调用堆栈有关的东西。
虽然ES5的严格模式不引进TCO,并应在2013年(ES6 - 和谐)结束做到这一点。我已经挂了几个网站here的,如果你关心你的内部函数变量之前阅读更多关于此事

+0

谢谢。现在它工作正确。 – jangofett

+0

@jangofett:不客气,尽管如此,感谢某人帮助您投票/接受答案的方式,而不是张贴感谢评论 –