2

我是 Javascript 的初学者。在自己尝试递归时,我使用 while 循环得到了一些奇怪的结果。并且使用 If 语句得到正确的结果。

这是代码和结果:

var test = function f(n){
    while(n > 0){
        document.write(n);
        f(--n);     
    }
};

test(5);

结果:

5432112113211211432112113211211

使用 If 语句时

var test = function f(n){
    if(n > 0){
        document.write(n);
        f(--n);     
    }
};

test(5);

结果是:

54321

在这种情况下,我无法真正调试它while。老实说,这让我在某些时候感到困惑。

4

2 回答 2

2

5432112113211211432112113211211 你可以看到模式:

5432112113211211
 432112113211211

543211211
  3211211
 43211211
  3211211

543211
   211
  3211
   211
 43211
   211
  3211
   211

etc

这些只是它经历的所有循环。首先它打印 5,然后拆分为 4,然后再拆分为 3,依此类推。

于 2012-07-10T23:28:01.437 回答
1

需要注意的重要一点是,每次在 中运行代码时,都会f使用一个名为n. 因此,通过递归调用f,您将添加到作用域链中。您不断添加到作用域链中,直到n > 0is false。一旦它为假,您就开始遍历存在其他版本的作用域链n。重复该过程,直到所有n范围内的所有变量都变为0.

请注意当我在下面的数字中添加一些空格时出现的模式。每次代码必须沿作用域链向上时,我都会添加一个空格。每组数字都代表沿着作用域链向下的代码。

54321 1 21 1 321 1 21 1 4321 1 21 1 321 1 21 1

这是一个应该有帮助的jsfiddle。它打印两个数字:第一个代表您所在的范围,第二个与您在代码中打印的数字相同。查看第一个数字并尝试了解如何为每个范围创建一个新数字。n当您稍后在程序中返回该范围时,尝试考虑应该是什么值。

于 2012-07-10T23:35:42.523 回答