#c
#includevoid 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); } попробуйте так тоже.
Комментариев нет:
Отправить комментарий