Рекурсивная функция для печати чисел с обратным отсчетом в c - PullRequest
0 голосов
/ 05 октября 2019

Я пытаюсь написать программу, которая читает целое число n с клавиатуры и печатает n, n-1, ... n, используя рекурсивную функцию. Приведенный ниже код работает, но я не совсем понимаю, почему или шаги, связанные с рекурсивной функцией. Может кто-нибудь объяснить, пожалуйста?

void countingdown(int n){
    if (n == 1){
        printf("%d\n", n);
        return;
    }
    else {
        printf("%d\n", n);
        countingdown(n - 1);
        return;
    }
}

int main(){
    int n;
    printf("Enter an integer: ");
    scanf("%d", &n);
    countingdown(n);
    printf("\n");
    return 0;
} 

Ответы [ 2 ]

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

Если, например, пользователь введет значение 3, произойдет следующее:

  1. Функция main вызовет обратный отсчет с параметром 3.
  2. Функция обратного отсчетаЗатем этот параметр 3 будет сравниваться со значением 1, и, поскольку это сравнение оценивается как false , он напечатает число 3, а затем вызовет обратный отсчет (то есть функция сама вызовет) с параметром 2.
  3. Этот второй экземпляр обратного отсчета теперь будет сравнивать этот параметр 2 со значением 1, и, поскольку это сравнение оценивается как false , он напечатает число 2 и обратный отсчет вызовов с параметром 1.
  4. Этот третий экземпляр обратного отсчета теперь будет сравнивать параметр 1 со значением 1, и поскольку это сравнение теперь оценивается как true , он напечатает число 1 и больше не будет вызывать себя.

Рекурсивная функция рассматривает параметр 1 как особый, поскольку это значение, при котором оно должнок.т.. Когда он встречает это значение, он перестает вызывать себя рекурсивно. Если функция не проверяет это специальное значение, она будет продолжать обратный отсчет, а также выведет 0, -1, -2 и т. Д.

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

Вы можете переписать рекурсивную функцию countdown()

Аналогично этому

int countingdown(int n){

    if (n == 0){//return exit from recursion
        return;
    }
    else {
        printf("%d\n", n);
        countingdown(n - 1);
    }
}

Предположим, мы вызываем ее с countdown(5). Пока мы не достигнем 0, печать n, то есть 5, 4, 3, 2, 1, будет продолжаться. На последнем шаге эта переменная n достигает 0, как мы выражаем, если функция секции возвращается и ее выполнение заканчивается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...