Вычеслить факториал - рекурсия или цикл
рекурсию лучше не использовать там, где без неё можно обойтись, к тому же будет медленнее.
Лучше рекурсия чисто в эстетическом плане и в понимании кода, а фактически хуже (т.к. время на запись активации функции и размещения её на стэк всяка медленнее чем обычный jump). Т.к. для данной задачи производительность не критична, лично я голосую за рекурсию.
{
int total = 1;
for(int i = 2; i < n; i++)
total *= i;
return total;
}
а я ни за что не голосую :) в данной задаче - требуется использовать рекурсию, соответственно исходим из этого требования. хотя вообще - лучше обходится без нее. использование циклов не менее читабельно - см., например, алгортимы by Merlin.
а где это пишется? что-то не заметила...
и как модератор низкоуровневого програмирование я прекрасно представляю как выглядит рекурсия
и почему же рекрсия медленее я просто не понимаю
по поводу скорости. прикинь, сколько времени будет выполнятся "плоский" код состоящий из нескольких условных и безусловных переходов и сколько - код с многократным вложеным вызовом некоторой процедуры. во втором случае - необходимо сохранить текущее состояние регистров, засунуть в стек нужные параметры ну и сам call выполнить. это ПОМИМО кода, выполняющего основную задачу. я умолчу о возможности просто переполнить стек в результате слишком глубокой рекурсии...
допустим надо выполнить рекурсию 1000 раз стека может не хватить......
но скорость примерно та же
на асме лучше так не делать, а в дельфи или паскале или с++ пожалуйста ..............
Для малых n не имеет значения, а для больших (n>7) - ни то, ни другое, используй апроксимацию Стирлинга.
Однако, бывают задачи, где использование итерационных алгоритмов ведет к значительному усложнению кода, и, как следствие, ухудшению его качества. Это, как правило, задачи, рекурсивные по своей природе. Например, алгоритмы связанные с обработкой деревьев. Каждое поддерево также является деревом, поэтому здесь использование рекурсии явяется вполне естественным.
Вычисление факториала тоже можно отнести к таким задачам, однако, здесь реализация алгоритма очень легко может быть представлена в итерационном виде, поэтому использование рекурсии считаю здесь просто неоправданным.
Например, алгоритмы связанные с обработкой деревьев. Каждое поддерево также является деревом, поэтому здесь использование рекурсии явяется вполне естественным.
ну на самом деле можно просто исспользовать свой стек и неплохо обрабатывать деревья без рекурсии. Или очередь, для такого метода рекурсия вобще не подойдет.
Очереди действительно лучше обрабатывать без рекурсии. Но для общего случая дерева ее использование вполне оправдано.
Да не потребует это усложнения. Просто стек ручками придется реализовывать. А потенциальные ошибки - они из за плохого проектирования возникают, а не из-за сложности задачи.
Очереди действительно лучше обрабатывать без рекурсии. Но для общего случая дерева ее использование вполне оправдано.
Очереди вобще не стековая структура - поэтому бессмысленно. Но ведь дерево вполне можно обрабатывать обходя вширину, и тогда тут нужна именно очередь, а не рекурсия-стек )
расход памяти мож - несколько раз больше чем необходимо. Притом
размер стека -64 кб а в паскале по умолчанию вообще 16 кб выделяется. Даже со студенческой лабой вылететь можно.
раньше целое поколение ЭВМ - исуственный интеллект - умерло из-за этого. зато в прологе - 2 вида рекурсии (1 - невозможен)- а циклов нет совсем. на этих машинах изначально не меньше 8 МБ стояло, когда на ПС -640 кб. всё ради красивой записи программы. Отсюда и название - искусственный интелект - когда за программиста комп думает. Но
справедливости ради надо отметить, что ИИ возвращается в программной эмуляции в наши программы, и сотрудничает внутри традиционных автокодовых программ. И ресурсоёмкость - не единственная причина смерти ИИ.
Странно, я думал, что ИИ, наоборот, расцветает и прогрессирует?:)
Разве Каспарова не обыгрывала машина?;)
Притом
размер стека -64 кб а в паскале по умолчанию вообще 16 кб выделяется. Даже со студенческой лабой вылететь можно.
Да нету ни в какком паскали ни в других подобных языках такой ривязки )) Есть конкретные аппаратные ограничения и в связи с ними ограничения конкретных реализаций. )) И все. В самих языках такого нет )
Такая рекурсия может быть преобразована в итерацию, не использующую стек, автоматически компилятором.