Почему рекурсия должна быть предпочтена по повторению?

Повторение более производительно, чем рекурсия, правильно? Тогда, почему некоторые люди полагают, что рекурсия лучше (более изящный в их словах), чем повторение? Я действительно не вижу, почему некоторые языки как Haskell не позволяют повторение и поощряют рекурсию? Разве это не абсурдно для поощрения чего-то, что имеет плохую производительность (и что также, когда больше производительной опции т.е. рекурсии доступны)? Пролейте некоторый свет на это. Спасибо.

61
задан 3 revs, 3 users 67% 2 February 2010 в 18:22
поделиться

13 ответов

Итерация более производительна, чем рекурсия, верно?

Не обязательно. Эта концепция пришла из многих C- подобно языкам, где вызов функции, рекурсивный или нет, имел большие накладные расходы и создавал новый стековый фрейм для каждого вызова.

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

62
ответ дан 24 November 2019 в 17:08
поделиться

«Итерация более эффективно, чем рекурсия», - это действительно язык - и / или компилятор. Случай, который приходит к уму, это когда компилятор содержит петлю-развертывание. Если вы реализовали рекурсивное решение в этом случае, это будет немного медленнее.

Это где он платит ученый (тестирование гипотез) и узнать ваши инструменты ...

0
ответ дан 24 November 2019 в 17:08
поделиться

У вас есть пара вариантов:

  1. Данные в газетах будут изменять параметры сообщения (и получить действительно так, как вы можете изменить URL).
  2. Вы также можете комбинировать FoxyProxy ( https://addons.mozilla.org/en-us/firefox/addon/2464 ) с любым количеством бесплатных интерактивных прокси (Fiddler, Paros, Burp, Charles )
  3. Наконец, вы можете не использовать прокси и записать скрипт Greasemonkey.

Я думаю, что вы, вероятно, будете иметь наибольшую успеваемость с подходом PoxyProxy + прокси. К сожалению, это не единственный аддон.

-121--4167079-

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

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

-121--942463-

Рекурсия - это типичная реализация итерации. Это просто нижний уровень абстракции (по крайней мере, в Python):

class iterator(object):
    def __init__(self, max):
        self.count = 0
        self.max = max

    def __iter__(self):
        return self

    # I believe this changes to __next__ in Python 3000
    def next(self):
        if self.count == self.max:
            raise StopIteration
        else:
            self.count += 1
            return self.count - 1

# At this level, iteration is the name of the game, but
# in the implementation, recursion is clearly what's happening.
for i in iterator(50):
    print(i)
1
ответ дан 24 November 2019 в 17:08
поделиться

В настоящее время я работаю с Rational ClearCase и не могу жаловаться (по крайней мере, 'до сих пор).

До этого мы использовали ChireMan Dimensions, это обычный инструмент CVS со многими ресурсами, но, на мой взгляд, он делает управление версиями очень бурократичным, по крайней мере: он отличается печально известным эксклюзивным оформлением. Мне также не нравится дизайн.

ClearCase имеет вид проводника Windows, и как только вы привыкнете к нему, он становится очень простым в использовании. Она также имеет хорошую и легкую интеграцию с MS Visual Studio.

-121--3227032-

Вы должны пойти с подрывной, или, может быть, git или mercurial.

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

Кроме того, вам, вероятно, следует получить сторонний хостинг вместо запуска собственного сервера.

-121--3227039-

Я думаю, что это поможет понять, о чем на самом деле идет речь. Эта ссылка показывает, как идеально разумно закодированное приложение на самом деле имеет много комната для оптимизации - а именно коэффициент 43! Ничто из этого не имеет отношения к итерации или рекурсии.

Если приложение настроено так далеко , оно попадает в точку, где циклы, сохраненные итерацией в сравнении с рекурсией, могут на самом деле иметь значение.

1
ответ дан 24 November 2019 в 17:08
поделиться

в Java, рекурсивные решения, как правило, превосходят нерешительные. В C, он имеет тенденцию быть другим способом. Я думаю, что это держит в целом для адаптивно скомпилированных языков против впереди скомпилированных языков.

Редактировать: «Вообще» я имею в виду что-то вроде раскола 60/40. Это очень зависит от того, насколько эффективно обрабатывает языковые вызовы методов. Я думаю, что jit Compilation Favors Recursion Recursion, потому что он может выбрать, как обрабатывать встроив и использовать данные времени выполнения в оптимизации. Это очень зависит от алгоритма и подписания компилятора, хотя. В частности, Java продолжает становиться умнее о обработке рекурсии.

Количественные результаты исследования с Java (ссылка PDF) . Обратите внимание, что это в основном алгоритмы сортировки и используют более старую виртуальную машину Java (1.5.x, если я читаю справа). Они иногда получают улучшение производительности 2: 1 или 4: 1 с помощью рекурсивной реализации, и редко рекурсия значительно медленнее. В моем личном опыте разница не часто выражена, но улучшение на 50% распространено, когда я использую разумную рекурсию.

2
ответ дан 24 November 2019 в 17:08
поделиться

Итерация - это просто специальная форма рекурсии.

4
ответ дан 24 November 2019 в 17:08
поделиться

Поскольку ИТЕРАЦИЯ низкого уровня имеет дело с реестром CX для подсчета циклов и, конечно же, реестры данных. РЕКУРСИЯ не только занимается этим, но и добавляет ссылки на указатель стека, чтобы сохранить ссылки на предыдущие вызовы, а затем как вернуться .-

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

1
ответ дан 24 November 2019 в 17:08
поделиться

Несколько вещей:

  1. Итерация не обязательно быстрая
  2. Корень всякого зла: поощрять что-то только потому, что оно может быть умеренно быстрым - это преждевременно; есть и другие соображения.
  3. Рекурсия часто гораздо более лаконична и ясно передает ваши намерения
  4. Обычно, избегая мутирующего состояния, функциональные языки программирования легче рассуждать и отлаживать, и рекурсия является примером этого.
  5. Рекурсия требует больше памяти, чем итерация.
4
ответ дан 24 November 2019 в 17:08
поделиться

Как утверждали другие, в рекурсии нет ничего менее производительного по своей сути. Есть языки, где это будет медленнее, но это не универсальное правило.

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

Показательный пример:

fib 0 = 0
fib 1 = 1
fib n = fib(n-1) + fib(n-2)

Я не могу представить итеративного решения, которое могло бы прояснить намерение.

9
ответ дан 24 November 2019 в 17:08
поделиться

Вот некоторая информация о плюсе и минусах рекурсии и итерации в C:

http://www.stanford.edu/~blp/writings/clc/recursion-vs-iteration.html

в основном Для меня рекурсия иногда легче понимать, чем итерация.

5
ответ дан 24 November 2019 в 17:08
поделиться

HASKELL не позволяет итерации, потому что итерация включает в себя союзное состояние (индекс).

-121--942472-

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

В целом, рекурсия заставляет вас быть явным в отношении государства, которое вы приносите в следующую итерацию (это параметры). Это может облегчить языковые процессоры для параллелизма выполнения. По крайней мере, это направление, которое языковые дизайнеры пытаются эксплуатировать.

2
ответ дан 24 November 2019 в 17:08
поделиться

HASKELL не позволяет итерации, потому что итерация включает в себя сочетаемое состояние (индекс).

14
ответ дан 24 November 2019 в 17:08
поделиться

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

Я не могу говорить с Haskell, поскольку я никогда им не пользовался, но это касается более общей части вопроса, поставленного в вашем заголовке.

36
ответ дан 24 November 2019 в 17:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: