我是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
案例中进行真正的调试。说实话,这让我感到困惑。
答案 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 > 0
为false
。一旦错误,您就开始遍历范围链,其中存在其他版本的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
的值应该是什么。