Тело while
выполняется только один раз на каждой рекурсивной глубине.while
ложно, когда i
равно 10
, что будет, когда tester ()
вызывается 10 раз рекурсивно.Поскольку i
объявлен глобальным, обновление i++
будет видно для каждого вызова tester ()
.
На последней рекурсивной глубине, когда условие while
ложно, последнее tester ()
вызов вернется к своей предыдущей глубине.В этот момент следующая итерация цикла while
будет ложной, поскольку i
равно 10
.Оператор cout
будет встречаться после завершения каждого цикла while
, который будет последовательно печатать значения k
, увеличивающиеся на каждой рекурсивной глубине, по мере отката рекурсии.
Вручную отследите, что происходитчтобы понять вещи.
ОБНОВЛЕНИЕ
Посмотрите на результаты выполнения.Особо обратите внимание на параметр d
, который обозначает рекурсивную глубину.На каждой глубине цикл while
повторялся один раз, до последнего ", в то время как истина, тестер называл" output.На глубине 10 значение while
является ложным, поскольку оно равно 10, и в первый раз он возвращает элемент управления к своему предыдущему уровню глубины (первый «возврат назад», когда i
равен 10
).После возврата управление возвращается в тело цикла while
последнего уровня, из которого была вызвана функция (из которой она только что вернулась), и следующая итерация этого цикла будет ложной (i является глобальным и10 или более), поэтому это также возвращает.Точно так же на каждой рекурсивной глубине 2-я итерация цикла while
имеет значение false и продолжает возвращаться.Проверьте выход.
i k d
1 1 0, call from main
2 1 1, while is true, tester called
3 1 2, while is true, tester called
4 1 3, while is true, tester called
5 1 4, while is true, tester called
6 1 5, while is true, tester called
7 1 6, while is true, tester called
8 1 7, while is true, tester called
9 1 8, while is true, tester called
10 1 9, while is true, tester called
11 1 10, returning back, print k // this step the while is false in depth 10
12 2 9, returning back, print k // from now on, as the recursion rolls back
13 3 8, returning back, print k // the second iteration at each recursive
14 4 7, returning back, print k // depth will be executed, and each while
15 5 6, returning back, print k // condition will be false, therefore it will
16 6 5, returning back, print k // not call tester anymore and return the control
17 7 4, returning back, print k // to the previous level. NOICE the `d' parameter
18 8 3, returning back, print k
19 9 2, returning back, print k
20 10 1, returning back, print k
А вот и тестовый код.Я надеюсь, что описание теперь очень понятно (?).Анализ это поможет.
#include <stdio.h>
int i = 1;
int k = 1;
void tester (int d)
{
while (i++ < 10)
{
printf ("%2d %2d %2d, while is true, tester called\n", i, k, d);
tester (d+1);
}
printf ("%2d %2d %2d, returning back, print k\n", i, k++, d);
}
int main (void)
{
int depth = 0;
printf ("i k d\n");
printf ("%2d %2d %2d, call from main\n", i, k, depth);
tester (depth + 1);
return 0;
}