считая до определенного числа вниз и обратно с рекурсией - PullRequest
1 голос
/ 17 октября 2019

Это С-назначение. используйте 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 Я знаю, что это не работает, но я понятия не имею, как я могу настроить его вправовыход. Может кто-нибудь дать мне несколько советов? Большое спасибо!

Ответы [ 2 ]

1 голос
/ 17 октября 2019

Нет необходимости использовать статическую переменную. Функция может быть написана проще.

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

заново вызывает countDown(k); с тем же значением k, которое было передано текущему вызову функции countDownUp, потому что внутри функции значение k не меняется ..

Также необходимо указать спецификатор преобразования %u вместо %d, поскольку переменная k имеет тип unsigned int.

0 голосов
/ 17 октября 2019

Q: Что делает CountDownUp() в общем случае?
A: Он печатает n дважды, с результатом CountDownUp(n - 1) между ними.

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

Q: Что такое остановка? условие?
A: Когда CountDownUp вызывается с 0.
Q: Что мы тогда делаем?
A: Печатать только один раз и останавливать рекурсию.

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

Вуаля!

...