Страницы

Поиск по вопросам

воскресенье, 8 марта 2020 г.

Помогите разобрать код на Си

#c


#include 
void CntTo3(int);
void CntTo2(int);
void CntTo1(int);
int main() {
    int n;
    CntTo3(3);
    return 0;
}
void CntTo3(int p) {
    CntTo2(p-1);
    printf("%d\n",p);
}
void CntTo2(int p) {
    CntTo1(p-1);
    printf("%d\n",p);
}
void CntTo1(int p) {
    printf("%d\n",p);
}


После компиляции, показывается ответ как -

1
2
3


Получается, чтобы вывести 1 в функции CntTo3, нужно выполнить функцию CntTo2, которая
будет равняться 2, ну и CntTo1 уже выводит без вычислений 3. Я правильно понял? Если
да, то почему в main() определяется CntTo3(3) и зачем переменная n?
    


Ответы

Ответ 1



int main() { int n; CntTo3(3); return 0; } void CntTo3(int p) { CntTo2(p-1); printf("%d\n",p); } void CntTo2(int p) { CntTo1(p-1); printf("%d\n",p); } void CntTo1(int p) { printf("%d\n",p); } Давайте просто подставлять код вместо вызова: int main() { int n; CntTo2(2); printf("%d\n",3); return 0; } void CntTo2(int p) { CntTo1(p-1); printf("%d\n",p); } void CntTo1(int p) { printf("%d\n",p); } Следующая подстановка: int main() { int n; CntTo1(1); printf("%d\n",2); printf("%d\n",3); return 0; } void CntTo1(int p) { printf("%d\n",p); } И последняя: int main() { int n; printf("%d\n",1); printf("%d\n",2); printf("%d\n",3); return 0; } Так понятнее? Переменная n нигде не работает (кстати, компилятор должен предупредить об этом).

Ответ 2



Тут такая ситуация: вызов функции и печать на экран, играет большую роль. Если поменять местами вызова функции и вывода на экран, получится 3,2,1 Тут главное порядок. Сначала выполняется вызов другой функции, а потом уже вывод текущего значения. Если поменять местами: void CntTo3(int p) { printf("%d\n",p); CntTo2(p-1); } void CntTo2(int p) { printf("%d\n",p); CntTo1(p-1); } void CntTo1(int p) { printf("%d\n",p); } тогда получится 3,2,1 и это не рекурсия. Рекурсия это тогда, когда функция вызывает сама себя void CntTo3(int p) { if (p>1) CntTo3(p-1); printf("%d\n",p); } попробуйте так тоже.

Комментариев нет:

Отправить комментарий