使用我的.net基础认证。在练习测试中,有一个问题,一些示例代码要求输出。正确答案是...... 循环3 循环2 循环1 循环1
问题是我不明白为什么它会重复最后一次"循环1"。我把它放入VS2015并发现它实际上是正确的。请注意,我并没有要求修复代码,我要求解释为什么它会重复最后一个值。我已经搜索过,但没有找到明确的答案。所以,这是代码。
namespace ConsoleApplication5
{
class Program
{
private static int WriteToConsole(int NumWrites)
{
int i = NumWrites;
while (i > 0)
{
Console.WriteLine("loop {0}", i);
i = WriteToConsole(i - 1);
}
return NumWrites - 1;
}
static void Main(string[] args)
{
WriteToConsole(3);
Console.ReadKey();
}
}
}
答案 0 :(得分:8)
请研究堆栈展开。
我会尽力给你一个想法。
答案 1 :(得分:1)
这是代码流程的一个例子。每个indention代表一个新的堆栈(递归调用rootReducer = combineReducers({
moduleA: combineReducers({
popupA: popupReducer("id1"),
popupB: popupReducer("id2")
}),
moduleB: combineReducers({
popupA: popupReducer("id3")
})
})
});
)并且WriteToConsole
变量已替换为代码中该步骤的当前值。
i
对WriteToConsole(3)
while(3>0)
Console.WriteLine(3)
WriteToConsole(2)
while(2>0)
Console.WriteLine(2)
WriteToConsole(1)
while(1>0)
Console.WriteLine(1)
WriteToConsole(0)
while(0>0)
return -1
while(-1>0)
return 0
while(0>0)
return 1
while(1>0)
Console.WriteLine(1)
WriteToConsole(0)
while(0>0)
return -1
while(-1>0)
return 2
的重新调用基本上写入当前数字然后递减。这将导致写出3到1.但是你可以看到,在第一组递归调用之后,本地WriteToConsole
变量将被设置为1,你将再次通过i
循环,因此它将第二次打印1。因此,给它一个起始数为4将产生4,3,2,1,1,2,1的输出。并且传入5将得到5,4,3,2,1,1,2 ,1,3,2,1,1
答案 2 :(得分:0)
原因是它在循环中存在递归调用。 对于初始值3,循环将执行3次,但由于递归调用,它还将启动一个初始值为2的新循环,该循环将执行一次。
初始值越高,您在结果中找到的重复次数就越多
答案 3 :(得分:0)
它与递归方法如何处理i
有关。每次调用WriteToConsole
时,它都会返回减去1的nubmer。但是当在while循环中调用它时,它会被i - 1
调用,所以实际上该方法正在执行{{ 1}}。使用此模式运行每个数字时,会出现以下行为:
i = i - 2;
执行两次:一次针对WriteToConsole(3);
,一次针对3
。1
针对WriteToConsole(2);
执行一次,但不针对2
执行。0
针对WriteToConsole(1);
执行一次,但不针对1
执行。-1
仅在嵌套递归返回后才执行WriteToConsole(3);
。产生以下结果:
1