Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Вычеслить факториал - рекурсия или цикл

261
14 ноября 2006 года
ahilles
1.5K / / 03.11.2005
рекурсия лучше чем цикл
257
14 ноября 2006 года
kosfiz
1.6K / / 18.09.2005
[quote=ahilles]рекурсия лучше чем цикл[/quote]
рекурсию лучше не использовать там, где без неё можно обойтись, к тому же будет медленнее.
242
14 ноября 2006 года
Оlga
2.2K / / 04.02.2006
[quote=ahilles]рекурсия лучше чем цикл[/quote]
можешь объяснить чем?

http://forum.codenet.ru/showthread.php?t=31736
2
14 ноября 2006 года
squirL
5.6K / / 13.08.2003
[quote=ahilles]рекурсия лучше чем цикл[/quote] рекурсия ХУЖЕ чем цикл. потому что медленнее. тебе, как модератору Низкоуровнего программирования, следовало бы представлять, как выглядит на низком уровне рекурсия ;)
273
15 ноября 2006 года
3A3-968M
1.2K / / 22.12.2005
[quote=squirL]рекурсия ХУЖЕ чем цикл. потому что медленнее. тебе, как модератору Низкоуровнего программирования, следовало бы представлять, как выглядит на низком уровне рекурсия ;)[/quote]
Лучше рекурсия чисто в эстетическом плане и в понимании кода, а фактически хуже (т.к. время на запись активации функции и размещения её на стэк всяка медленнее чем обычный jump). Т.к. для данной задачи производительность не критична, лично я голосую за рекурсию.
242
15 ноября 2006 года
Оlga
2.2K / / 04.02.2006
неужели цикл настолько нечитабелен:
 
Код:
int fact(int n)
{
   int total = 1;
 
   for(int i = 2; i < n; i++)
      total *= i;
 
    return total;

}
2
15 ноября 2006 года
squirL
5.6K / / 13.08.2003
[quote=3A3-968M]Лучше рекурсия чисто в эстетическом плане и в понимании кода, а фактически хуже (т.к. время на запись активации функции и размещения её на стэк всяка медленнее чем обычный jump). Т.к. для данной задачи производительность не критична, лично я голосую за рекурсию.[/quote]
а я ни за что не голосую :) в данной задаче - требуется использовать рекурсию, соответственно исходим из этого требования. хотя вообще - лучше обходится без нее. использование циклов не менее читабельно - см., например, алгортимы by Merlin.
242
15 ноября 2006 года
Оlga
2.2K / / 04.02.2006
[quote=squirL]в данной задаче - требуется использовать рекурсию[/quote]
а где это пишется? что-то не заметила...
2
15 ноября 2006 года
squirL
5.6K / / 13.08.2003
хе :) глюк! ну тогда рекурсию ваще ффпечь. просто это классическая задача, на которой объясняют принцип работы рекурсивных алгоритмов. абберация сознания сработала :)
6.3K
15 ноября 2006 года
Neutral
76 / / 13.12.2005
Люди, что вы спорите непонятно о чем? Все зависит от задачи. Если вам нужно оптимизировать программу - ясно что рекурсию нужно менять. Если нет + условие позволяет + человек только начинает програмировать - почему бы не использовать рекурсию (он же должен знать что это). А вобще если вы уже начинаете оптимизировать эту задачу - то лучше забить константый массив факториалов - все равно вы сможете посчитать максимум где то 30! (без использования длинной арифметики), а если учесть что вы их еще будете сумировать ... А нахождение факториалов за О(1) меньше чем за О(n) :) , но это я уже начал заниматься непонятно чем, извините.
2
15 ноября 2006 года
squirL
5.6K / / 13.08.2003
на том и порешим )
261
17 ноября 2006 года
ahilles
1.5K / / 03.11.2005
я имел ввиду то что на языках высокого уровня рекурсия лучше, просто так лучше смотрится и так проще понять и к тому же писать меньше надо
и как модератор низкоуровневого програмирование я прекрасно представляю как выглядит рекурсия
и почему же рекрсия медленее я просто не понимаю
2
17 ноября 2006 года
squirL
5.6K / / 13.08.2003
смотрится - безусловно лучше. тут ты прав.
по поводу скорости. прикинь, сколько времени будет выполнятся "плоский" код состоящий из нескольких условных и безусловных переходов и сколько - код с многократным вложеным вызовом некоторой процедуры. во втором случае - необходимо сохранить текущее состояние регистров, засунуть в стек нужные параметры ну и сам call выполнить. это ПОМИМО кода, выполняющего основную задачу. я умолчу о возможности просто переполнить стек в результате слишком глубокой рекурсии...
261
18 ноября 2006 года
ahilles
1.5K / / 03.11.2005
про переполнение стека ты прав
допустим надо выполнить рекурсию 1000 раз стека может не хватить......
но скорость примерно та же
на асме лучше так не делать, а в дельфи или паскале или с++ пожалуйста ..............
2
18 ноября 2006 года
squirL
5.6K / / 13.08.2003
глупость. делфи, паскаль или С - все равно в итоге будет ассемблерный код.
3
18 ноября 2006 года
Green
4.8K / / 20.01.2000
[QUOTE=ahilles]рекурсия лучше чем цикл[/QUOTE]
Для малых n не имеет значения, а для больших (n>7) - ни то, ни другое, используй апроксимацию Стирлинга.
63
19 ноября 2006 года
Zorkus
2.6K / / 04.11.2006
Апроксимация Стирлинга не дает точных значений. Для больших значений прекрасно подойдет длинная арифметика, причем, написанная простыми циклами, она будет работать для вполне больших чисел (а вот для нее, пожалуй, рекурсия посложнее будет...). И почему нельзя вычислить точно и довольно быстро факториал, скажем, 50? Извини, не понял тебя тут.
21K
22 ноября 2006 года
Overmind
10 / / 21.11.2006
Действительно, как было замечено выше, рекурсия плоха тем, что медленна, и замусоривает стек. В общем случае, итерационное решение лучше, чем рекурсивное. Любой алгоритм можно закодировать не используя рекурсию.

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

Вычисление факториала тоже можно отнести к таким задачам, однако, здесь реализация алгоритма очень легко может быть представлена в итерационном виде, поэтому использование рекурсии считаю здесь просто неоправданным.
240
22 ноября 2006 года
aks
2.5K / / 14.07.2006
Цитата: Overmind

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


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

21K
22 ноября 2006 года
Overmind
10 / / 21.11.2006
Можно, но это потребует усложнения логики работы алгоритмов, и, как следствие, влечет за собой потенциальные ошибки. Если проектировщик опытный, то он может позволить себе итерационную реализацию рекурсивных по приоде своей алгоритмов, и это решение будет лучше рекурсивного. Но не каждому это под силу.

Очереди действительно лучше обрабатывать без рекурсии. Но для общего случая дерева ее использование вполне оправдано.
240
22 ноября 2006 года
aks
2.5K / / 14.07.2006
Цитата: Overmind
Можно, но это потребует усложнения логики работы алгоритмов, и, как следствие, влечет за собой потенциальные ошибки.


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

Цитата: Overmind

Очереди действительно лучше обрабатывать без рекурсии. Но для общего случая дерева ее использование вполне оправдано.


Очереди вобще не стековая структура - поэтому бессмысленно. Но ведь дерево вполне можно обрабатывать обходя вширину, и тогда тут нужна именно очередь, а не рекурсия-стек )

16K
23 ноября 2006 года
ivanhoeivanhoe
20 / / 01.11.2006
в старом языке у тебя на каждый самовызов будет дополнительно забираться память на сохранение данных о состоянии системы плюс данные вызвавшей "надпрограммы" - промежуточные. а потом по достижении самой внутренней подпр - память будет освобождаться.
расход памяти мож - несколько раз больше чем необходимо. Притом
размер стека -64 кб а в паскале по умолчанию вообще 16 кб выделяется. Даже со студенческой лабой вылететь можно.
раньше целое поколение ЭВМ - исуственный интеллект - умерло из-за этого. зато в прологе - 2 вида рекурсии (1 - невозможен)- а циклов нет совсем. на этих машинах изначально не меньше 8 МБ стояло, когда на ПС -640 кб. всё ради красивой записи программы. Отсюда и название - искусственный интелект - когда за программиста комп думает. Но
справедливости ради надо отметить, что ИИ возвращается в программной эмуляции в наши программы, и сотрудничает внутри традиционных автокодовых программ. И ресурсоёмкость - не единственная причина смерти ИИ.
63
23 ноября 2006 года
Zorkus
2.6K / / 04.11.2006
Цитата: ivanhoeivanhoe
ресурсоёмкость - не единственная причина смерти ИИ.


Странно, я думал, что ИИ, наоборот, расцветает и прогрессирует?:)
Разве Каспарова не обыгрывала машина?;)

240
23 ноября 2006 года
aks
2.5K / / 14.07.2006
Цитата:

Притом
размер стека -64 кб а в паскале по умолчанию вообще 16 кб выделяется. Даже со студенческой лабой вылететь можно.


Да нету ни в какком паскали ни в других подобных языках такой ривязки )) Есть конкретные аппаратные ограничения и в связи с ними ограничения конкретных реализаций. )) И все. В самих языках такого нет )

4.4K
26 ноября 2006 года
captain cobalt
43 / / 04.03.2004
Вычисление факториала - это концевая рекурсия.

Такая рекурсия может быть преобразована в итерацию, не использующую стек, автоматически компилятором.
7.6K
26 ноября 2006 года
Darien
125 / / 15.01.2006
А может и не быть. Какой, например , компилятор так сделает ?
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог