Как выглядит второй printf ("% d \ n", n);вызывается? - PullRequest
0 голосов
/ 04 марта 2019
// both() reads integers and prints the numbers in their original order
//   and then in reverse order.
// effects: reads input, produces output
void both(void) {
  int n = read_int();

  if(n != READ_INT_FAIL) {
  printf("%d\n", n);
  both();
  printf("%d\n", n);
  } 
}

 int main(void) {
   both();
 }

Таким образом, этот код считывает целые числа и печатает число в исходном порядке и в обратном порядке.read_int () - это способ, которым мои учителя реализовали ввод.В любом случае, скажем, что ввод - 1, 2, 3, 4, 5. Ожидаемый вывод - 1, 2, 3, 4, 5, 5, 4, 3, 2, 1 (очевидно, это были бы новые строки вместо запятых, но яне хотел тратить вертикальное пространство).

Итак, мой вопрос: как это работает?

Из того, что я могу проследить в своей голове, both() вызывается по main, и он продолжает вызываться до того, как второй printf() будет доступен, пока не закончится весь код, потому что оба не будут вызваныкогда вводится недопустимое значение (любая произвольная буква после 5).

Как это работает?

Ответы [ 2 ]

0 голосов
/ 04 марта 2019

Мысль в вашей голове абсолютно правильна в этом случае.Так как функция «both» вызывается в одном и том же потоке , выполнение более поздних строк будет приостановлено до завершения выполнения вновь вызванной функции «both».В теории вычислений это называется рекурсия , а условие, которое прекращает вызов функции "Both" (рекурсивная), называется base case .

Таким образом, сводка вызовов выглядит так: i-input (значение), p-printf (значение), b-both (), rOi- остаток кода от обоих для ввода (значение)
я (1) -> р (1) -> б () -> я (2) -> р (2) -> б () -> я (3) -> р (3) -> б () -> i (4) -> p (4) -> b () -> i (5) -> p (5) -> b () -> i (недействительно, если условие не выполнено) -> rOi (5) -> Roi (4) -> Roi (3) -> Roi (2) -> Roi (1)

0 голосов
/ 04 марта 2019

Когда рекурсия останавливается, программа не заканчивается.Выполнение будет продолжено после внутреннего вызова both.Итак, это быстрое следование программе:

read_int = 1, print 1, call both() -> 1st recursion
read_int = 2, print 2, call both() -> 2nd recursion
read_int = 3, print 3, call both() -> 3rd recursion
read_int = 4, print 4, call both() -> 4th recursion
read_int = 5, print 5, call both() -> 5th recursion

read_int = 6, somehow the condition is true and the program continue at 5th recursion after the both() and print 5 again, so

5th recursion, print 5(second printf), end
4th recursion, print 4(second printf), end
3rd recursion, print 3(second printf), end
2nd recursion, print 2(second printf), end
1st recursion, print 1(second printf), end

Надеюсь, это поможет логике кода и выполнения.

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