C# 与嵌套for循环斗争
给定一个主数字和一个子集数字,希望找到所有可能的子集数字组合,这些数字加起来就是主数字。e、 g: 输入 主:10C# 与嵌套for循环斗争,c#,loops,for-loop,C#,Loops,For Loop,给定一个主数字和一个子集数字,希望找到所有可能的子集数字组合,这些数字加起来就是主数字。e、 g: 输入 主:10 子集:2,3,5,7 输出 结果:3+7=10,2+3+5=10 **注意:5+5=10不是有效的结果** 以下是我目前的情况: // Main traversal for (int a = 0; a < nums.Length; a++) { sum = a; for (int b = a + 1; b < nums.Length; b++)
子集:2,3,5,7 输出 结果:3+7=10,2+3+5=10
**注意:5+5=10不是有效的结果** 以下是我目前的情况:
// Main traversal
for (int a = 0; a < nums.Length; a++)
{
sum = a;
for (int b = a + 1; b < nums.Length; b++)
{
// Thinking this should be the loop that determines
// how many numbers are added together.
// e.g. Sum of 2 numbers, sum of 3 numbers, etc
for (int c = a + 1; c < nums.Length; c++)
{
sum += nums[b + c];
}
if (sum == mainNumber)
result += "Match found!\n";
}
}
//主遍历
对于(int a=0;a
我主要是在努力理解“for循环”。我试图找到一个“for循环”可视化工具,但没有成功。或者,递归会使这个问题更容易解决吗?将for循环看作是圆。嵌套循环类似于圆中的圆 谢天谢地,你的情况并不像这次那么复杂。在这张图片中,一个大的圆圈是一个for循环,它只有一次是真的。在for循环中,其他循环多次为真。每个不同大小的圆都是一个不同的环 我用更具描述性的名称重写了你的代码,唯一的目的是解释循环——我把所有“有用”的东西都拿出来,放进
console.writeline
语句
// I'm using 5 as an example check here.
for (int outerLoopCounter = 0; outerLoopCounter < 5; outerLoopCounter++)
{
Console.WriteLine("OUTER: {0}", outerLoopCounter);
for (int middleLoopCounter = 0; middleLoopCounter < 5; middleLoopCounter++)
{
Console.WriteLine("MIDDLE: {0}", middleLoopCounter);
for (int innerLoopCounter = 0; innerLoopCounter < 5; innerLoopCounter++)
{
Console.WriteLine("INNER: {0}", innerLoopCounter);
}
}
}
如果你看缩进,你可以看到一个图案。最靠近文本(左侧)的数字从外部循环输出。中间的数字来自中间的循环,最右边的数字来自最里面的循环
如您所见,外部循环正在缓慢旋转,计数为四(
0
,1
,2
,3
,4
),直到它不再小于五,此时它退出循环。中间的圆圈(循环)计数稍微快一点。每当外部循环增加1时,它会再次变为4(同样是0-4)。内圈旋转得相当快——它数到四,每次中圈增加时都会退出。将for循环视为圆。嵌套循环类似于圆中的圆
谢天谢地,你的情况并不像这次那么复杂。在这张图片中,一个大的圆圈是一个for循环,它只有一次是真的。在for循环中,其他循环多次为真。每个不同大小的圆都是一个不同的环
我用更具描述性的名称重写了你的代码,唯一的目的是解释循环——我把所有“有用”的东西都拿出来,放进console.writeline
语句
// I'm using 5 as an example check here.
for (int outerLoopCounter = 0; outerLoopCounter < 5; outerLoopCounter++)
{
Console.WriteLine("OUTER: {0}", outerLoopCounter);
for (int middleLoopCounter = 0; middleLoopCounter < 5; middleLoopCounter++)
{
Console.WriteLine("MIDDLE: {0}", middleLoopCounter);
for (int innerLoopCounter = 0; innerLoopCounter < 5; innerLoopCounter++)
{
Console.WriteLine("INNER: {0}", innerLoopCounter);
}
}
}
如果你看缩进,你可以看到一个图案。最靠近文本(左侧)的数字从外部循环输出。中间的数字来自中间的循环,最右边的数字来自最里面的循环
如您所见,外部循环正在缓慢旋转,计数为四(
0
,1
,2
,3
,4
),直到它不再小于五,此时它退出循环。中间的圆圈(循环)计数稍微快一点。每当外部循环增加1时,它会再次变为4(同样是0-4)。而内圈的旋转速度相当快——它数到四,每次中圈增加时都会退出。递归几乎从来没有让问题变得更容易理解:)对于可视化工具,请将打印语句放在每个for循环的正下方,并打印a
,b
的值,和c
在每个位置。这将帮助您跟踪
您的代码实际在做什么,并可能帮助您更好地可视化它。或者只是附加调试器。。。。更现实地说,你正在尝试做一个组合生成器;我会考虑创建它并评估结果(我认为在.NET中内置了一个)。调试器的问题是,它没有留下一个关于刚刚发生的事情的良好历史记录,这使得学习变得更加困难。它们对于现在的状态很好,但对于过去的状态没有那么好。@MichaelDorgan您应该在最新的可视化研究中尝试历史调试。执行几乎从未使问题更容易理解:)对于可视化工具,将打印语句放在每个for循环的正下方,并打印a
,b
,的值,和c
在每个位置。这将帮助您跟踪
您的代码实际在做什么,并可能帮助您更好地可视化它。或者只是附加调试器。。。。更现实地说,你正在尝试做一个组合生成器;我会考虑创建它并评估结果(我认为在.NET中内置了一个)。调试器的问题是,它没有留下一个关于刚刚发生的事情的良好历史记录,这使得学习变得更加困难。它们对于现在的状态很好,但对于过去的状态没有那么好。@MichaeldOrgang您应该在最新的Visual Studio中尝试历史调试