Хвостовая рекурсия против прямой рекурсии в Эрланге - PullRequest
5 голосов
/ 09 февраля 2011

Является ли рекурсия хвоста лучше, чем прямая рекурсия для исполнения в эрланге?
Или компилятор erlang также оптимизирует прямую рекурсию?
Я имею в виду, есть ли причины использовать хвостовую рекурсию вместо прямой рекурсии?
На мой взгляд, прямая рекурсия выглядит более симпатично.

Ответы [ 2 ]

10 голосов
/ 09 февраля 2011

Хвостовая рекурсия и прямая рекурсия - это совершенно разные понятия.См. Это обсуждение .

Можно написать прямую рекурсию, которая является хвостовой рекурсией и, следовательно, оптимизирована.Также возможно написать прямую рекурсию, которая не является хвостовой рекурсией: в этом случае она не будет оптимизирована, то есть будет занимать пространство стека.

3 голосов
/ 09 февраля 2011

Хвостовая рекурсия обычно лучше, потому что она использует меньше памяти. В следующий вызов вы вносите только то, что вам нужно, что минимизирует использование памяти в стеке. Кроме того, когда хвостовой рекурсивный код оптимизирован, ненужные возвращаемые функции отбрасываются, что в некоторых случаях делает его немного быстрее.

Например, если возвращаемое значение функции является вызовом другой функции, нет необходимости хранить промежуточную функцию в стеке. Таким образом, код возвращается непосредственно к вызывающей стороне из внутренней функции.

Не хвостовая рекурсия оптимизирована для хвостовой рекурсии в некоторых случаях компилятором Erlang, но не рассчитывайте на это. Сделайте хорошей привычкой кодировать хвостовые рекурсивные функции, когда это возможно.

...