Полезный способ думать о хвостовых вызовах - это спросить «что должно произойти с результатом рекурсивного вызова процедуры?»
Первая функция не может быть оптимизирована хвостом, потому что результат *Необходимо использовать 1004 * внутреннего вызова fac
и умножить на n
, чтобы получить результат общего вызова fac
.
Во втором случае, однако, результат'внешний' вызов fact
является ... результатом внутреннего вызова fact
.Больше ничего с этим не нужно делать, и последнее значение может быть просто передано обратно непосредственно как значение функции.Это означает, что никакой другой контекст функции не должен быть сохранен, поэтому его можно просто отбросить.
Стандарт R5RS определяет «хвостовой вызов», используя понятие хвостовой контекст , которыйпо сути то, что я описал выше.