Одна рекурсивная функция может использовать оптимизацию хвостовой рекурсии для предотвращения переполнения стека, но как насчет взаимно-рекурсивных функций?Взаимно рекурсивные функции в функциональных языках программирования
Это answer показывает, как определить взаимно рекурсивные функции в F #:
let rec F() =
G()
and G() =
F()
Это определено таким образом, чтобы генерируемый родной машинный код или байт-код будет состоять в конечном счете, только одна функция с оптимизацией хвостовой рекурсии применяется как для F, так и для G? Это предотвратит переполнение стека?
Как работает алгоритм работы с хвостом для взаимно рекурсивных функций?
С другой стороны, Haskell не нуждается в таком синтаксисе. Это из-за ленивой оценки Хаскелла? Или, как предлагает @augustss, компиляторы Haskell также выполняют те же действия, что и выше?
Синтаксис не влияет на то, какой код сгенерирован, если компилятор не очень наивен. – augustss
F # оптимизирует взаимно рекурсивные функции в некоторых случаях –