递归计数直到某个数字递减并备份

counting until a certain number down and back up with recursion

这是一个 C 作业。使用 void countDownUp(unsigned int k) 写一个递归来计数,直到某个数字下降然后立即备份。例如,如果 k = 3,输出应该是 3 2 1 0 1 2 3。我已经写了一个 countDown 函数

void countDown(unsigned int k)
{   
    printf("%d ", k);
    if (k > 0)
        countDown(k-1);
}

还有一个 countUp 函数。我在我的 void countDownUp(unsigned int k) 函数中使用了这个函数,如下所示:

void countDownUp(unsigned int k)
{   
    countDown(k);
    static int n=0;
    if(n < k){
        printf("%d ", n+1);
        n++;
        countDownUp(k);
    }
}

现在的输出是3 2 1 0 1 3 2 1 0 2 3 2 1 0 3 3 2 1 0我知道它不起作用,但我不知道如何将它调整到正确的输出。有人可以给我一些建议吗?非常感谢!

不需要使用静态变量。函数可以写得更简单

#include <stdio.h>

void countDownUp( unsigned int n )
{
    printf( "%u ", n );
    if ( n )
    {
        countDownUp( n - 1 );
        printf( "%u ", n );
    }       
}

int main(void) 
{
    countDownUp( 3 );

    return 0;
}

程序输出为

3 2 1 0 1 2 3

至于你的功能实现

void countDownUp(unsigned int k)
{   
    countDown(k);
    static int n=0;
    if(n < k){
        printf("%d ", n+1);
        n++;
        countDownUp(k);
    }
}

然后函数内的调用

countDownUp(k);

anew 调用 countDown(k); 使用与传递给函数 countDownUp 的当前调用相同的 k 值,因为在函数内 k 的值是不变..

您还需要指定转换说明符 %u 而不是 %d 因为变量 k 的类型为 unsigned int.

问:一般情况下CountDownUp()是做什么的?
A: 它打印了两次 n,中间的结果是 CountDownUp(n - 1)

void CountDownUp(int n) {
    printf("%d ", n);
    CountDownUp(n - 1);
    printf("%d ", n);
}

问:停止条件是什么?
A: 当调用 CountDownUp 时用 0.
问:那我们怎么办?
A: 只打印一次,停止递归。

void CountDownUp(int n) {
    printf("%d ", n);
    if (n == 0) return;
    CountDownUp(n - 1);
    printf("%d ", n);
}

Voila!