Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Цикл или рекурсия (https://javascript.ru/forum/misc/48533-cikl-ili-rekursiya.html)

vadi 07.07.2014 20:54

Цикл или рекурсия
 
Из текста учебника я понял, что код с использованием цикла эффективнее по сравнению с рекурсией. Но...

Я нашел в интернете функцию, которая из введенного в текстовое поле списка строк удаляет дубликаты. Мне нужна более специфическая задача, но очень похожая, и я решил взять за основу интернетный прототип. Он был реализован в виде рекурсии. Я сделал с циклом и он работает в разы быстрее, но меня терзают смутные сомнения. Ведь почему-то изначально программист (видимо более опытный чем я) сделал с рекурсией...

foo 07.07.2014 21:09

Не парься. Любой рекурсивный алгоритм выразим итеративно. В языках без оптимизации хвостовой рекурсии (ЕМНИП, js к таковым относиться), рекурсия -- это жопа. Она память жрет, производительность падает. Не нужно рекурсивно ничего пейсать. Некоторые хомячки пишут рекурсивно, просто ради позерства, чтобы показать всему миру своим друзьям "в контакте", что они пишут в фапе-стайле.
Нутыпонел.

kobezzza 07.07.2014 21:22

Цитата:

ЕМНИП, js к таковым относиться
Все современные VM JS уже неплохо оптимизируют рекурсии (разумеется лишь частные случаи). Древней книжки Крокфорда начитался? Прежде чем включать умника нужно подумать (а лучше вообще не включать).

Цитата:

рекурсивно, просто ради позерства
Рекурсия - простое, очевидно и элегантное решение. Разумеется всё нужно юзать с умом.

foo 07.07.2014 21:27

Цитата:

Сообщение от kobezzza
Все современные VM уже оптимизируют неплохо хвостовые рекурсии

Даже если так, надо еще писать в хвосто-рекурсивном стиле, а это гребаный адЪ. И даже с оптимизацией она сольет итерации.

Цитата:

Сообщение от kobezzza
Рекурсия простое, очевидно и элегантное решение.

Это очередной базворд. Приведи пример где это справедливо. Я чет не видел такого, если не считать задроченного до дыр факториала, да и то вопрос.

kobezzza 07.07.2014 21:29

Цитата:

Сообщение от foo (Сообщение 319870)
Это очередной базворд. Приведи пример где это справедливо. Я чет не видел такого, если не считать задроченного до дыр факториала, да и то вопрос.

Любой поиск в глубину, например удаление непустой папки. Только полный кретин будет "оптимизировать" это место переписывая 3 строчки рекурсия на 30 с циклом и искусственным стеком.

foo 07.07.2014 21:32

Цитата:

Сообщение от kobezzza
(разумеется

И кстати, почему разумеется?

kobezzza 07.07.2014 21:33

Цитата:

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

foo 07.07.2014 21:33

Цитата:

Сообщение от kobezzza
3 строчки рекурсия на 30

Покажи пример. Нет такого даже близко.

kobezzza 07.07.2014 21:38

Цитата:

Сообщение от foo (Сообщение 319875)
Покажи пример. Нет такого даже близко.

Напиши паттерн "примесь" на рекурсии и без. Я писал оба варианта. Вариант на циклах больше раза в 2 и супер не очевидный.

Без рекурсии: https://github.com/kobezzza/Collecti...e/obj.jsn#L118

изучай.

***

Сколько лет ты пишешь код? 0.1? оно и видно, но зато в каждом треде всех учишь и рассказываешь сказки.

foo 07.07.2014 21:38

Цитата:

Сообщение от kobezzza
Писать надо так, чтобы работать с этим нормально было, а оптимизации оставь для компиляторов и специальных библиотек.

kobezzza,
Ты уверен, что ты понимаешь о чем говоришь?
Код:

fact=function(n){if(n<2) return 1; return n*(fact(n-1))}
Это не хвосто-рекурсивный код. его соптимизировать невозможно.


Часовой пояс GMT +3, время: 21:11.