在while循环中使用递归会产生奇怪的结果

Strange result using recursion with while loop

本文关键字:结果 递归 循环 while      更新时间:2023-09-26

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

这是代码和结果:

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

结果:

543211211321121143211211321121

使用If语句时

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

结果是:

54321

我真的无法在while的情况下调试它。老实说,这有时会让我感到困惑。

5432112113211211432112113211211你可以看到模式:

5432112113211211
 432112113211211
543211211
  3211211
 43211211
  3211211
543211
   211
  3211
   211
 43211
   211
  3211
   211
etc

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

需要注意的是,每次在f内部运行代码时,都会使用名为n变量创建一个新的作用域。因此,通过递归调用f,您就添加到了作用域链中。您一直添加到作用域链中,直到n > 0变成false。如果为false,则开始向上遍历作用域链,其中存在其他版本的n。该过程重复进行,直到所有作用域中的所有n变量变为0

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

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

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