在while循环中使用递归会产生奇怪的结果
Strange result using recursion with while loop
我是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
的值应该是什么。
相关文章:
- 数组在递归方法中设置为null
- Kendo:我该如何在树视图中创建一个递归的hieiarchy
- 递归使用 eval() 是检查程序执行的好方法吗?
- 使用递归、Ramda.js和无点样式重构字符串的getPermutations()
- 递归深度比较
- Eloquent JavaScript递归示例如何终止为返回1,但仍然输出指数值
- 递归函数中断
- 如何递归地获取嵌套对象中所有子对象的列表
- JavaScript 素数搜索无限递归
- 在递归生成器函数中,yield后面的*(星号/星号)语法意味着什么
- 递归|两个函数名
- 有没有一种方法可以在Javascript中进行可变递归currying
- 在while循环中使用递归会产生奇怪的结果
- JavaScript:从递归返回结果
- 将递归承诺的结果添加到数组中
- jQuery递归获取等待结果
- Javascript递归函数返回未定义而不是预期结果
- 尝试从json树状结构JavaScript递归创建一个结果数组
- JS数组连接的结果递归扁平化
- 递归函数中的Array.prototype.reduce产生了意想不到的结果