this post was submitted on 16 Dec 2023
32 points (97.1% liked)

Programming

17364 readers
210 users here now

Welcome to the main community in programming.dev! Feel free to post anything relating to programming here!

Cross posting is strongly encouraged in the instance. If you feel your post or another person's post makes sense in another community cross post into it.

Hope you enjoy the instance!

Rules

Rules

  • Follow the programming.dev instance rules
  • Keep content related to programming in some way
  • If you're posting long videos try to add in some form of tldr for those who don't want to watch videos

Wormhole

Follow the wormhole through a path of communities [email protected]



founded 1 year ago
MODERATORS
 

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");
}
you are viewing a single comment's thread
view the rest of the comments
[–] Merwyn 3 points 10 months ago* (last edited 10 months ago) (6 children)

You are looking at a recursive method, as you can see with the line draw(n-1) inside the draw(n) method. You can search for "recursive function" on internet for a better understanding.

Basically, the method draw is called a first time n = a user input, but then this method call itself with n-1 until it reach 0. So you can think as if function draw(6) will call draw(5) and wait for it to return before continuing, draw(5) call draw(4), ect until draw(0) that return immediately.

So then the order of execution will be draw(1) that print " #\n" and return, then draw(2) will proceed to print "##\n" and return, then draw(3), ect until draw(n).

[–] [email protected] 1 points 10 months ago (5 children)

Right. I was aware it was recursion as stated in the title of my post. I had two questions specific to where the for loop returns after printing #.

[–] Merwyn 2 points 10 months ago* (last edited 10 months ago) (4 children)

Yes, as I wrote when the method draw(n=1) finish the for loop that print one "#", this call of the method draw return. Then the process start again from the after the line draw(n-1) of the method draw(n=2), which execute the for loop to print "##" and return. Then again you come back to after the line draw(n-1) of inside the method draw(n=3), ect.

You should keep in mind that everytime a draw(n-1) is called, the current method is "paused" until this call return.

[–] [email protected] 1 points 10 months ago (1 children)

I see. I guess my understanding was that the recursion was over after the recursive call, but it's actually for all the code in draw().

[–] Merwyn 2 points 10 months ago* (last edited 10 months ago) (1 children)

Yes, to better understand this you have to understand the "flow" of the program. Meaning the order at which the instructions are executed and not written.

Here you have the flow of the program starting from n =3 until the recursion reach draw(0), note that none of the for loop have been executed yet. At this point it reach the first "return" instruction and go finish the call to draw(0).

Then the flow go back to where it previously was: inside the draw(1) call just after the line calling draw(0). And it start executing the next lines of the draw(1): the for loop.

Then it reach the second "return" and proceed again until the whole program is over.

[–] [email protected] 1 points 10 months ago (1 children)

Yes, that helps. Thanks. I see now how n goes from 1 to 2 to 3...etc. Now not so sure how i = 1 when the for loop starts.

[–] Merwyn 1 points 10 months ago

When called with n=1 ? It's from i=0 to i<1, so it will do only one iteration with i=0 and print one #.

load more comments (2 replies)
load more comments (2 replies)
load more comments (2 replies)