读三重嵌套for循环

时间:2017-03-08 04:05:37

标签: c++ for-loop nested

我的代码如下。我的困惑发生在第二和第三循环期间。为什么结果返回1 ***然后12 **然后123 *然后1234 ..我得到j循环被重置为0但是它没有重新进入k循环,只要它是真的j< = i?

for(int i = 1; i <= 4; i++)
{
    for(int j = 1; j <= i; j++)
        cout << j;
    for(int k = 4 - i; k >= 1; k--)
        cout << "*";

    cout << endl;
}

2 个答案:

答案 0 :(得分:3)

首先澄清一下:

首先:j永远不会重置为0,而是重置为1。

其次:这不是三重嵌套for循环,而是(但不需要让代码按照你的描述运行):

for(...) {
    for(...) {
        for(...) { 
        }
    }
}

令你困惑:

漂亮打印代码:

for(int i=1; i<=4; i++) {
    // Write the digits 1..i (1, 12, 123, 1234)
    for(int j=1; j<=i; j++) {
        std::cout << j;
    }

    // Write the stars (***, **, *)
    for(int k=(4-i); k>=1; k--) {
        std::cout << "*";
    }

    std::cout << std::endl;
}

想象一下以下序列:

// Iteration  | i | j | k | String
// 1          | 1 | 1 | 3 | 1*
// 2          | 1 | 1 | 2 | 1**
// 3          | 1 | 1 | 1 | 1***\n
// 4          | 2 | 1 | - | 1
// 5          | 2 | 2 | - | 12
// 6          | 2 | 2 | 2 | 12*
// 7          | 2 | 2 | 1 | 12**\n
// 8          | 3 | 1 | - | 1
// 9          | 3 | 2 | - | 12
// 10         | 3 | 3 | - | 123
// 11         | 3 | 3 | 1 | 123*\n
// 12         | 4 | 1 | - | 1
// 13         | 4 | 2 | - | 12
// 14         | 4 | 3 | - | 123
// 15         | 4 | 4 | - | 1234\n

如果初始索引为

,则重新进入k循环
// k:=(4-i) >= 1

因此,进入k-Loop完全取决于索引i。

在数学上:

//         (4-i) >= 1
// <=>    -i >= (1-3)
// <=>    -i >= -3
// <=>     i <= 3

只要i <&lt; = 3。

,就会重新进入k循环

答案 1 :(得分:1)

为了获得您想要的效果,您的代码应该是这样的:

for(int i = 1; i <= 4; i++)
{
    for(int j = 1; j <= i; j++)
    {   
        cout << j;
        for(int k = 4 - i; k >= 1; k--)
            cout << "*";
    }
    cout << endl;
}

如果你没有{},只有在完成j循环后执行k循环