Стек как память о возврате
Явный стек может хранить множители, которые рекурсивный процесс вычисления факториала иначе оставил бы в отложенных вызовах.
Какую информацию сохраняет машина во время спуска в рекурсивную задачу?
- Перенос отложенного умножения в явный стек
- Использование регистра phase для различения спуска и возврата
- Связывание глубины стека с отложенной работой
Во время descend машина помещает n в стек и продолжает работу с n минус один. В базовом случае она записывает 1 в value и переключает phase на return.
Во время return каждый переход извлекает один сохраненный множитель и обновляет value. Пустой стек означает, что отложенного умножения не осталось, поэтому value является окончательным ответом.
- Вывод
- —
- Значение
- —
- Диагностика
- —
Первая программа возвращает (120 9). Машина выполняет пять переходов спуска и четыре извлечения из стека.
Найдите точку, в которой phase меняется с descend на return. До нее стек растет за счет cons. После нее стек уменьшается за счет cdr по мере роста value.
Измените программу и сравните результат.
Запустите машину для значения 6 и предскажите как значение факториала, так и число переходов.
Показать подсказку
Выполняется n переходов спуска и n минус один переходов возврата.