Как стать автором
Обновить

Комментарии 8

Думаю если вы показали способ поиска чисел Фибоначи при помощи рекурсивного процесса, то стоит так же показать и способ с итеративным процессом. Потому что в JS (из коробки) поиск с помощью рекурсивного процесса не эффективен :(

Если кому-то захочется подробнее ознакомиться с рекурсией, то на hexlet есть статья где про рекурсию написано подробнее
https://ru.hexlet.io/blog/posts/recursive

передадим в функцию Math.floor длину массива, поделим результат на 2

Всё-таки сначала делим длину пополам, а потом округляем. Иначе смысла нет.

А вообще, зачем pivot брать именно из середины? Есть в этом какая-то сермяга или так повелось просто?

Смотрите, элементы не упорядочены, поэтому первый в массиве ничем не хуже среднего. Но при этом избавляемся от вычислений середины и в цикле убираем одно сравнение - текущего с pivot.

Не то, чтобы большая оптимизация, но зачем бесполезную работу делать, статью ведь могут и дети читать, научатся плохому...

Пример с числами Фибоначчи в разделе "рекурсия" как мне кажется следует подавать только под соусом "как не надо делать" а лучше подать этот пример в разделе "оптимизация" с последующим объяснением "как надо делать и почему".

Потому что программист со школы/универа должен понимать что fibonachi(50) в вашей реализации создаст кучу (~2млрд) вызовов и повешает комп (мой ноут справился за 170сек на JS и за 52сек на сях).

Уместнее ряда Фибоначчи тут бы смотрелся факториал или разложение на множители, но тоже с оговорками.

Факториал вообще случай, когда вместо функции можно просто брать готовые значения из массива фиксированной длины. Числа Фибоначчи тоже, хоть и массив значительно больше, по сегодняшним меркам - мелочь. Зачем это вообще пересчитывать, ещё и рекурсивно?

Массив фиксированной длины для бесконечных последовательностей? К тому же Вы забываете что это учебная задача)

Поэтому я и говорю что это отличный пример для оптимизации.

1. решить задачу рекурсией.

2. решить итеративно на 3х переменных

3. уйти в длинную арифметику.

4. развернуть часть цикла в п2 чтобы сократить количество перестановок

5. предварительно посчитанная таблица значений

6. таблица контрольных точек значений от которых идём алгоритмом из п4.

Если длинная арифметика ещё слишком рано на этом этапе обучения - формулируем задачу как "найти последние 9 цифр числа Фибоначчи с номером 1..2^32". Готовая таблица значений для этой задачи если что займёт 16Gb. памяти.

При этом нет однозначного ответа на вопрос "какой алгоритм быстрее?". Быстрее пишется рекурсия, по соотношению затраты/профит - итеративный, быстрее без ограничений памяти - таблица. Это так же некорректно как считать быстрой быструю сортировку Хоара из этой статьи.

Забыл упомянуть формулу Бине - на ней можно показать опасность округления и длинную нецелочисленную арифметику.

Конечно с оговорками и в другой формулировке все верно, но Вы пытаетесь исправить изначально провальную тут идею рекурсии, заменив её на задачу оптимизации.

Возможно смысл учебы не в этом. Учебная задача на рекурсию для чисел Фибоначчи научит тому, что её бесполезно решать таким образом. Учебная задача на факториал научит переполнению и ограничениям применения стандартных числовых типов данных.

И главный вывод - который должен сделать ученик - что рекурсию использовать не надо :)

Вы пытаетесь исправить изначально провальную тут идею рекурсии

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

И главный вывод - который должен сделать ученик - что рекурсию использовать не надо

Есть еще пара выводов следом за главным) Если стоит тз "использовать рекурсию" - предупреди заказчика что тз некорректно, потом выжми из алгоритма что можно (в примере с Фибоначчи - кэшируй значения). Если есть уверенность что это место не станет узким - используй простое решение. Рекурсия пишется проще всего.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий