如何在递增计数后使用递归计数

时间:2017-09-29 18:34:34

标签: c recursion

我试图让我的计划在计数到十之后倒计时。我试图改变代码,使其倒计时无效。

#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;
}

2 个答案:

答案 0 :(得分:2)

这是一个简单的递归示例,它说明了Eugene的评论:

#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;
}

它会在递归的过程中计入,倒计时在它退出时。实际上在下来的路上它只会重新打印出潜入下一级别之前的状态:

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

答案 1 :(得分:0)

如果在其中使用静态局部变量,则可以轻松实现该函数。例如。

#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;
}

程序输出

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

在函数中,静态变量m在for循环中表现为一个索引(或者有更合适的do-while循环)。

首先,它被零隐式初始化(​​如任何静态变量)

static unsigned int m;

如果需要,可以显式使用初始化程序

static unsigned int m = 0;

然后它从0变为n,然后从n再次向后变为0。

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