I used the debugger to examine this code but not understanding a couple areas.

  1. Why does the for loop repeat after it exits to print a new line? If it exits the loop, shouldn’t it be done with it?
  2. Why is n incremented and not i as stated with i++?

int main(void)
{
    int height = get_int("Height: ");

    draw(height);
}

void draw(int n)
{
    if (n <= 0)
    {
        return;
    }

    draw(n - 1);

    for (int i = 0; i < n; i++)
    {
        printf("#");
    }
    printf("\n");
}
  • dneaves@lemmy.world
    link
    fedilink
    arrow-up
    13
    ·
    1 year ago

    Why does the for loop repeat after it exits to print a new line? If it exits the loop, shouldn’t it be done with it?

    There’s the new line after the for loop to make sure that the next recursion starts on a fresh line. Otherwise the next recursion would print on the same line, right where it left off, and you’d just have a line of “#”'s. The for loop itself is just for printing “#”'s.

    Why is n incremented and not i as stated with i++?

    I think this is a confusion with the recursion. Look at the line with draw(n - 1); this happens before any printing of hashes happens, and only continues after its done. And it calls itself as long as it’s not less than or equal to 0. To psuedo-code the order of operations here:

    draw 3 {
        draw 2 {
            draw 1 {
                draw 0 {};
                print "#" * 1;
            };
            print "#" * 2;
        };
        print "#" *3;
    };
    

    so n is never incremented as you think, it just calls decremented versions of the draw function before the current one finishes. The i’s are purely involved in the for loop, which only prints hashes. Does that make sense?

    • milon@lemm.eeOP
      link
      fedilink
      arrow-up
      2
      ·
      1 year ago

      Yes - I finally caught that part about n as it’s just moving in reverse so it gets decremented. Now I’m not sure about i. In the debugger when the program gets to the for loop both n and i are equal to 1. The n I understand but i?

      • dneaves@lemmy.world
        link
        fedilink
        arrow-up
        3
        ·
        1 year ago

        i starts at 0, checks if i is less than n (the first time it will be, no matter what), prints a “#”, then increments i by 1 and loops