Page 74 - 6105
P. 74
На поточний момент в стеку вже два старих контексти
Вихід з pow (2, 1).
При виконанні pow (2, 1), на відміну від попередніх запусків, вираз n! = 1
дорівнюватиме false, тому спрацює друга гілка if..else:
function pow (x, n) {
if (n! = 1) {
return x * pow (x, n - 1);
} Else {
return x; // перший степінь числа дорівнює самому
числу
}
}
Тут вкладених викликів немає, так що функція закінчує свою роботу,
повертаючи 2. Поточний контекст більше не потрібен і видаляється з пам'яті, зі
стека відновлюється попередній:
Контекст: {x: 2, n: 3, рядок 3}
Контекст: {x: 2, n: 2, рядок 3}
Відновлюється обробка зовнішнього виклику pow (2, 2).
Вихід з pow (2, 2).
І тепер уже pow (2, 2) може закінчити свою роботу, повернувши 4.
Відновлюється контекст попереднього виклику:
Контекст: {x: 2, n: 3, рядок 3}
Відновлюється обробка зовнішнього виклику pow (2, 3).
Вихід з pow (2, 3).
Самий зовнішній виклик закінчує свою роботу, його результат: pow (2, 3) = 8.
Глибина рекурсії в даному випадку склала: 3.
Значення глибини рекурсії, яка дорівнює максимальному числу контекстів,
буде одночасно збережено в стеку.
73