Comments 17
1. Термальное (встречается в тексте 4 раза, то есть не опечатка) или всё же терминальное?
2. Зачем реализовывать «итеративный» вариант через рекурсию?
2. Зачем реализовывать «итеративный» вариант через рекурсию?
Про хвостовую рекурсию забыли рассказать )
Разве не терминальное? Термальное — это же что-то курортное.
Термальное условие
Разве не терминальное? Термальное — это же что-то курортное.
Да, правильно терминальное, но я, увы, привык говорить термальное и это отразилось в статье.
Думаю, очевидно, что итеративный процесс потребляет меньше памяти.
Да, TCO делает это утверждение бессмысленным, если не ошибочным. В языках с TCO можно не задумываясь считать факториалы миллионов и (если есть нативная поддержка целых чисел любой длмны) — даже напечатать ответ.
Совсем не задумываясь не получится. Рекурсия должна быть хвостовой.
Я думал, первая буква дважды упомянутой аббревиатуры TCO как бы намекает на это :)
После первых трех шишек, любая рекурсия автоматически выходит из под пера хвостовой.
Ну если вы посмотрите на код, прямо над той фразой которую прокомментировали у автора, то как раз и увидите ту самую хвостовую рекурсию:
в отличии:
Неплохо вышла (возможно автоматически). Не очень правда понятно, что вам в ней не понравилось.
которую автор называет итеративным процессом
const factorial = (n) => {
const iter = (counter, acc) => {
if (counter === 1) {
return acc;
}
return iter(counter - 1, counter * acc);
};
return iter(n, 1);
};
в отличии:
от
const factorial = (n) => {
if (n === 0) {
return 1;
}
return n * factorial(n - 1);
}
Неплохо вышла (возможно автоматически). Не очень правда понятно, что вам в ней не понравилось.
В JS нет TCO, так что код выше помрет на сто-с-чем-то итерации от переполнения стека.
Ага, я знаю. А ещё я знаю, что не любую рекурсию можно выразить через хвостовую, так что с Фибоначчи можете не трудиться.
Если вы думаете, что Фибоначчи не выразить через хвостовую рекурсию, то это не так.
defmodule Fib do
def calc(count), do: calc(1, 1, count - 1)
def calc(_p, acc, 0), do: acc
def calc(p, acc, count), do: calc(acc, acc + p, count - 1)
def test do
Enum.map(1..20, &calc/1)
end
end
#⇒ [1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,
# 377, 610, 987, 1597, 2584, 4181, 6765, 10946]
Elixir поддерживает TCO, поэтому:
1_000_000 |> Fib.calc() |> to_string() |> String.length()
#⇒ 208988
Ну и кстати, было бы интересно посмотреть на ваш вариант хвостовой рекурсии для чисел Фибоначчи. Вы ведь достаточно шишек набили, чтобы автоматически получилось?
Код да и даже некоторые комментарии к нему копипаст с hexlet, хоть бы ссылку на источник оставляли.
кажется кто-то прочитал начало первой главы sicp и решил натянуть это на js ;-)
Sign up to leave a comment.
Функциональное программирование с точки зрения EcmaScript. Рекурсия и её виды