Разобрать рекурсивный код - C (СИ)

Узнай цену своей работы

Формулировка задачи:

#include <stdio.h>
 void CntTo3(int);
 void CntTo2(int);
 void CntTo1(int);
 int main()
 {
 int n; //1. зачем здесь вообще нужна эта переменная???
 CntTo3(3); // 2. что это такое??? Если это функция, то почему ж она не объявлена по-нормальному - void CntTo3 ? Тройка, которая в скобках - это типа аргумент функции (имеется ввиду - это типа int p ? Если это так, то разве можно внутри функции main объявлять это? разве это не надо делать где-нибудь в хэддере?
 return 0;
 }
 void CntTo3(int p) //2. p здесь равно 3, наверно
 {
      CntTo2(p-1); //3. p здесь равно 2, опять таки, наверно
      printf("%d\n",p);
 }
 void CntTo2(int p) // 3.  p здесь равно уже 2? и  почему void - она же возвращает значение, чтобы функция CntTo3 могла работать
 {
      CntTo1(p-1);
      printf("%d\n",p);
 }
 void CntTo1(int p)
 {
      printf("%d\n",p);
}
Честно говоря, вообще непонятно как это может работать (хотя, надо признать, работает). Программа считывается сверхну вниз - в функции CntTo3 выполнение дошло до того места, где CntTo2(p-1) - это ж функция определена только ниже так как тогда функция CntTo3 может включать ее в работу. Вопросы дебильные, понимаю. Си недавно только начала учить.

Решение задачи: «Разобрать рекурсивный код»

textual
Листинг программы
 void CntTo3(int p) 
 {      CntTo2(p-1); //в этом месте функция CntTo3 должна же вернуть значение 2 в функцию
                           // CntTo2? ВОЗВРАЩАЕТ!
      printf("%d\n",p); }
 
 void CntTo2(int p) { // здесь аргумент уже равен 2???
      CntTo1(p-1);
      printf("%d\n",p); }

Объяснение кода листинга программы

В данном коде присутствуют две функции: CntTo3 и CntTo2.

  1. Функция CntTo3 принимает целочисленный аргумент p и вызывает функцию CntTo2, передавая ей в качестве аргумента значение p - 1. После этого функция CntTo3 осуществляет вывод значения p с помощью функции printf.
  2. Функция CntTo2 также принимает целочисленный аргумент p и вызывает функцию CntTo1, передавая ей в качестве аргумента значение p - 1. После этого функция CntTo2 осуществляет вывод значения p с помощью функции printf.
  3. Функция CntTo1 не представлена в данном коде, поэтому мы не можем сказать, что происходит в этом месте. Таким образом, если мы вызовем функцию CntTo3 с аргументом 3, то она вызовет функцию CntTo2 с аргументом 2, которая в свою очередь вызовет несуществующую функцию CntTo1 с аргументом 1. После чего функция CntTo2 осуществит вывод значения 2, а функция CntTo3 осуществит вывод значения 3. Список действий:
  4. Вызов функции CntTo3 с аргументом 3.
  5. Внутри функции CntTo3 вызов функции CntTo2 с аргументом 2.
  6. Внутри функции CntTo2 вызов несуществующей функции CntTo1 с аргументом 1.
  7. Внутри функции CntTo2 вывод значения 2.
  8. Возврат из функции CntTo2.
  9. Внутри функции CntTo3 вывод значения 3.
  10. Возврат из функции CntTo3.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 4 из 5