使用while循环的递归的奇怪结果

时间:2012-07-10 23:21:55

标签: javascript recursion while-loop

我是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案例中进行真正的调试。说实话,这让我感到困惑。

2 个答案:

答案 0 :(得分:2)

5432112113211211432112113211211 你可以看到模式:

5432112113211211
 432112113211211

543211211
  3211211
 43211211
  3211211

543211
   211
  3211
   211
 43211
   211
  3211
   211

etc

这些只是它经历的所有循环。首先它打印5,然后拆分为4并再次拆分为3等。

答案 1 :(得分:1)

需要注意的重要一点是,每次在f内运行代码时,都会使用名为n变量创建新范围。因此,通过递归调用f,您将添加到范围链中。您继续添加到范围链,直到n > 0false。一旦错误,您就开始遍历范围链,其中存在其他版本的n。重复此过程,直到所有范围中的所有n变量都变为0

注意我在下面的数字中添加一些空格时出现的模式。每次代码必须上传范围链时,我都添加了一个空格。每组数字代表范围链下的代码。

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

Here is a jsfiddle that should be helpful.它会打印两个数字:第一个代表您所在的范围,第二个代码与您在代码中打印的数字相同。查看第一个数字,并尝试围绕如何为每个范围创建新数字。尝试在程序中稍后返回该范围时考虑n的值应该是什么。