Повторение более производительно, чем рекурсия, правильно? Тогда, почему некоторые люди полагают, что рекурсия лучше (более изящный в их словах), чем повторение? Я действительно не вижу, почему некоторые языки как Haskell не позволяют повторение и поощряют рекурсию? Разве это не абсурдно для поощрения чего-то, что имеет плохую производительность (и что также, когда больше производительной опции т.е. рекурсии доступны)? Пролейте некоторый свет на это. Спасибо.
Итерация более производительна, чем рекурсия, верно?
Не обязательно. Эта концепция пришла из многих C- подобно языкам, где вызов функции, рекурсивный или нет, имел большие накладные расходы и создавал новый стековый фрейм для каждого вызова.
Для многих языков это не так, и рекурсия столь же или более производительна, чем итерационная версия. В наши дни даже некоторые компиляторы C переписывают некоторые рекурсивные конструкции в итеративную версию или повторно используют кадр стека для хвостового рекурсивного вызова.
«Итерация более эффективно, чем рекурсия», - это действительно язык - и / или компилятор. Случай, который приходит к уму, это когда компилятор содержит петлю-развертывание. Если вы реализовали рекурсивное решение в этом случае, это будет немного медленнее.
Это где он платит ученый (тестирование гипотез) и узнать ваши инструменты ...
У вас есть пара вариантов:
Я думаю, что вы, вероятно, будете иметь наибольшую успеваемость с подходом 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)
В настоящее время я работаю с Rational ClearCase и не могу жаловаться (по крайней мере, 'до сих пор).
До этого мы использовали ChireMan Dimensions, это обычный инструмент CVS со многими ресурсами, но, на мой взгляд, он делает управление версиями очень бурократичным, по крайней мере: он отличается печально известным эксклюзивным оформлением. Мне также не нравится дизайн.
ClearCase имеет вид проводника Windows, и как только вы привыкнете к нему, он становится очень простым в использовании. Она также имеет хорошую и легкую интеграцию с MS Visual Studio.
-121--3227032-Вы должны пойти с подрывной, или, может быть, git или mercurial.
Это явно не стоит того, чтобы вы покупали что-либо, я думаю, вы можете удалить коммерческие решения из вашего списка сразу.
Кроме того, вам, вероятно, следует получить сторонний хостинг вместо запуска собственного сервера.
-121--3227039-Я думаю, что это поможет понять, о чем на самом деле идет речь. Эта ссылка показывает, как идеально разумно закодированное приложение на самом деле имеет много комната для оптимизации - а именно коэффициент 43! Ничто из этого не имеет отношения к итерации или рекурсии.
Если приложение настроено так далеко , оно попадает в точку, где циклы, сохраненные итерацией в сравнении с рекурсией, могут на самом деле иметь значение.
в Java, рекурсивные решения, как правило, превосходят нерешительные. В C, он имеет тенденцию быть другим способом. Я думаю, что это держит в целом для адаптивно скомпилированных языков против впереди скомпилированных языков.
Редактировать: «Вообще» я имею в виду что-то вроде раскола 60/40. Это очень зависит от того, насколько эффективно обрабатывает языковые вызовы методов. Я думаю, что jit Compilation Favors Recursion Recursion, потому что он может выбрать, как обрабатывать встроив и использовать данные времени выполнения в оптимизации. Это очень зависит от алгоритма и подписания компилятора, хотя. В частности, Java продолжает становиться умнее о обработке рекурсии.
Количественные результаты исследования с Java (ссылка PDF) . Обратите внимание, что это в основном алгоритмы сортировки и используют более старую виртуальную машину Java (1.5.x, если я читаю справа). Они иногда получают улучшение производительности 2: 1 или 4: 1 с помощью рекурсивной реализации, и редко рекурсия значительно медленнее. В моем личном опыте разница не часто выражена, но улучшение на 50% распространено, когда я использую разумную рекурсию.
Поскольку ИТЕРАЦИЯ низкого уровня имеет дело с реестром CX для подсчета циклов и, конечно же, реестры данных. РЕКУРСИЯ не только занимается этим, но и добавляет ссылки на указатель стека, чтобы сохранить ссылки на предыдущие вызовы, а затем как вернуться .-
Мой университетский учитель сказал мне, что все, что вы делаете с рекурсией, можно сделать с помощью итераций и наоборот, однако иногда проще сделать это рекурсией, чем Итерация (более элегантная), но на уровне производительности лучше использовать Итерации .-
Несколько вещей:
Как утверждали другие, в рекурсии нет ничего менее производительного по своей сути. Есть языки, где это будет медленнее, но это не универсальное правило.
При этом для меня рекурсия - это инструмент, который нужно использовать, когда это имеет смысл. Есть некоторые алгоритмы, которые лучше представить в виде рекурсии (точно так же, как некоторые лучше через итерацию).
Показательный пример:
fib 0 = 0
fib 1 = 1
fib n = fib(n-1) + fib(n-2)
Я не могу представить итеративного решения, которое могло бы прояснить намерение.
Вот некоторая информация о плюсе и минусах рекурсии и итерации в C:
http://www.stanford.edu/~blp/writings/clc/recursion-vs-iteration.html
в основном Для меня рекурсия иногда легче понимать, чем итерация.
HASKELL не позволяет итерации, потому что итерация включает в себя союзное состояние (индекс).
-121--942472-Я не думаю, что есть что-то в целях меньше всего исполнения в рекурсии - по крайней мере, в абстрактном. Рекурсия - это особая форма итерации. Если язык предназначен для поддержки рекурсии хорошо, возможно, он может выполнить так же, как итерацию.
В целом, рекурсия заставляет вас быть явным в отношении государства, которое вы приносите в следующую итерацию (это параметры). Это может облегчить языковые процессоры для параллелизма выполнения. По крайней мере, это направление, которое языковые дизайнеры пытаются эксплуатировать.
HASKELL не позволяет итерации, потому что итерация включает в себя сочетаемое состояние (индекс).
Попытайтесь реализовать поиск в глубину рекурсивно и итеративно и скажите мне, какой из них дал вам облегчение. Или сортировка слиянием. Для многих проблем это сводится к явному поддержанию вашего собственного стека вместо того, чтобы оставлять ваши данные в стеке функций.
Я не могу говорить с Haskell, поскольку я никогда им не пользовался, но это касается более общей части вопроса, поставленного в вашем заголовке.