David Scarpa
David Scarpa

Reputation: 11

how to use recursion to count down after counting up

I am trying to get my program to count down after counting up to ten. I have tried to alter the code from counting up to make it count down to no avail.

#include <stdio.h>

void count(int k)
{
    if (k > 0) {
        count(-k + 1);
        printf("%d", k);
    }
    else {
        if (k == 0)
        {
            printf("%d,", k);
        }
        else {
            count(k + 1);
            printf("%d,", -k);
        }
    }

}

int main(int argc, char ** argv)
{
    count(10);
    getchar();
    return 0;
}

Upvotes: 1

Views: 1761

Answers (2)

Vlad from Moscow
Vlad from Moscow

Reputation: 310990

The function can be easy implemented if to use a static local variable inside it. For example.

#include <stdio.h>

void count(unsigned int n)
{
    static unsigned int m;

    printf("%u ", m);

    if (n != m)
    {
        ++m;
        count(n);
        --m;

        printf("%u ", m);
    }
}

int main( void )
{
    const unsigned int N = 10;
    unsigned int i = 0;

    do
    {
        count(i);
        putchar('\n');
    } while (i++ != N);

    return 0;
}

The program output is

0
0 1 0
0 1 2 1 0
0 1 2 3 2 1 0
0 1 2 3 4 3 2 1 0
0 1 2 3 4 5 4 3 2 1 0
0 1 2 3 4 5 6 5 4 3 2 1 0
0 1 2 3 4 5 6 7 6 5 4 3 2 1 0
0 1 2 3 4 5 6 7 8 7 6 5 4 3 2 1 0
0 1 2 3 4 5 6 7 8 9 8 7 6 5 4 3 2 1 0
0 1 2 3 4 5 6 7 8 9 10 9 8 7 6 5 4 3 2 1 0

Within the function the static variable m behaves as an index in a for loop (or there will be more suitable a do-while loop).

At first it is initialized implicitly by zero (as any static variable)

static unsigned int m;

You can use the initializer explicitly if you want

static unsigned int m = 0;

then it is changed from 0 to n and afterward backward from n again to 0.

++m; // changing from 0 to n
count(n);
--m; // changing from n to 0

Upvotes: 0

Serge
Serge

Reputation: 12354

Here is a simple example of the recursion which does this, illustrating Eugene's comment:

#include <stdio.h>

void count(int n) {
    if (n > 10) {
        printf("\n");
        return;
    }

    printf("%d ", n);
    count(n+1);
    printf("%d ", n);
}

int main() {
    count(0);
    printf("\n");
    return 0;
}

it counts up on the way into recursion and counts down while it exits it. Actually on the way down it only re-prints the state which it was before diving into the next level:

0 1 2 3 4 5 6 7 8 9 10
10 9 8 7 6 5 4 3 2 1 0

Upvotes: 2

Related Questions