【问题标题】:Struggling with nested for loop在嵌套 for 循环中苦苦挣扎
【发布时间】:2016-12-21 20:02:03
【问题描述】:

给定一个主数和一个数的子集,想要找到所有可能的子集数的组合,这些子集数加起来就是主数。例如:

输入

主要: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++)
    {
      // 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";
    }
}

我主要是在努力理解“for 循环”。我试图找到一个“for循环”可视化工具,但没有运气。或者,递归会使这个问题更容易解决吗?

【问题讨论】:

  • 递归几乎不会让问题更容易理解:)
  • 对于可视化工具,将打印语句放在每个 for 循环的正下方,并在每个位置打印 abc 的值。这应该可以帮助您 trace 您的代码实际在做什么,并且可以帮助您更好地可视化它。
  • 或者只是附加调试器....更实际的是,您正在尝试做一个组合生成器;我会考虑创建 that 并评估结果(我认为 .NET 中内置了一个)
  • 调试器的问题在于它不会留下刚刚发生的事情的良好历史,这使得学习变得更加困难。它们对于现在的状态很好,但对于过去的状态却没有那么好。
  • @MichaelDorgan 你应该在最新的 Visual Studio 中尝试历史调试

标签: c# loops for-loop


【解决方案1】:

将 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);
        }
    }
}

输出如下:

OUTER:             0
MIDDLE:              0
INNER:                 0
INNER:                 1
INNER:                 2
INNER:                 3
INNER:                 4
MIDDLE:              1
INNER:                 0
INNER:                 1
INNER:                 2
INNER:                 3
INNER:                 4
MIDDLE:              2
INNER:                 0
INNER:                 1
INNER:                 2
INNER:                 3
INNER:                 4
MIDDLE:              3
INNER:                 0
INNER:                 1
INNER:                 2
INNER:                 3
INNER:                 4
MIDDLE:              4
INNER:                 0
INNER:                 1
INNER:                 2
INNER:                 3
INNER:                 4
OUTER:             1
MIDDLE:              0
INNER:                 0
INNER:                 1
INNER:                 2
INNER:                 3
INNER:                 4
MIDDLE:              1
INNER:                 0
INNER:                 1
INNER:                 2
INNER:                 3
INNER:                 4
MIDDLE:              2
INNER:                 0
INNER:                 1
INNER:                 2
INNER:                 3
INNER:                 4
MIDDLE:              3
INNER:                 0
INNER:                 1
INNER:                 2
INNER:                 3
INNER:                 4
MIDDLE:              4
INNER:                 0
INNER:                 1
INNER:                 2
INNER:                 3
INNER:                 4
OUTER:             2
MIDDLE:              0
INNER:                 0
INNER:                 1
INNER:                 2
INNER:                 3
INNER:                 4
MIDDLE:              1
INNER:                 0
INNER:                 1
INNER:                 2
INNER:                 3
INNER:                 4
MIDDLE:              2
INNER:                 0
INNER:                 1
INNER:                 2
INNER:                 3
INNER:                 4
MIDDLE:              3
INNER:                 0
INNER:                 1
INNER:                 2
INNER:                 3
INNER:                 4
MIDDLE:              4
INNER:                 0
INNER:                 1
INNER:                 2
INNER:                 3
INNER:                 4
OUTER:             3
MIDDLE:              0
INNER:                 0
INNER:                 1
INNER:                 2
INNER:                 3
INNER:                 4
MIDDLE:              1
INNER:                 0
INNER:                 1
INNER:                 2
INNER:                 3
INNER:                 4
MIDDLE:              2
INNER:                 0
INNER:                 1
INNER:                 2
INNER:                 3
INNER:                 4
MIDDLE:              3
INNER:                 0
INNER:                 1
INNER:                 2
INNER:                 3
INNER:                 4
MIDDLE:              4
INNER:                 0
INNER:                 1
INNER:                 2
INNER:                 3
INNER:                 4
OUTER:             4
MIDDLE:              0
INNER:                 0
INNER:                 1
INNER:                 2
INNER:                 3
INNER:                 4
MIDDLE:              1
INNER:                 0
INNER:                 1
INNER:                 2
INNER:                 3
INNER:                 4
MIDDLE:              2
INNER:                 0
INNER:                 1
INNER:                 2
INNER:                 3
INNER:                 4
MIDDLE:              3
INNER:                 0
INNER:                 1
INNER:                 2
INNER:                 3
INNER:                 4
MIDDLE:              4
INNER:                 0
INNER:                 1
INNER:                 2
INNER:                 3
INNER:                 4

如果您查看缩进,您可以看到一个图案。最接近文本(左侧)的数字从外循环输出。中间的数字来自中间的循环,最右边的数字来自最里面的循环。

如你所见,外循环在缓慢旋转,数到四个(01234),直到不再少于五个,在哪一点退出循环。中间的圆圈(循环)计数得稍微快一些。每次外循环增加 1 时,它会变为 4 一次(同样是 0-4)。内圈的旋转速度非常快——每次中间圈增加时,它数到四并退出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多