Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Разные способы реализации факториала


Автор: avnemchenko 10.7.2009, 12:09
Добрый день!

Какие есть различные технологии реализации расчета факториала в С++? Ну и сравнение скоростей... Подчеркиваю - именно ТЕХНОЛОГИИ, а не способы (скажем, использование цикла - это технология, а вот цикл for (..), while(..){} или do{..}while(..) - это способы). Мне пришли в голову 3 технологии:

Циклы:

Это очевидно и первое приходит в голову (в мою голову  smile ).

Код

long f (char val)
{
    long res;
    int f;

    if (val < 2)
        return 1;

    res = 1;
    for (f = 2; f <= val; ++f)
        res *= f;

    return res;

}

// ...

long res = f (5);


Рекурсивные функции

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

Код

long f (char val)
{
    if (val < 2)
        return 1;

    return val * f (val - 1);
}

// ...

long res = f (5);


Шаблоны (расчет при компиляции)

Достоинство и недостаток - результат возвращается при компиляции. Скорость, естественно, максимально возможно высокая. Но передавать можно только константу.

Код

template <int Val>
struct f
{
    enum { res = (Val) * f<(Val)-1>::res };
};
template <>
struct f <1>
{
    enum { res = 1 };
};

// ...

long res = f<5>::res;


Можно ли использовать подставляемые функции inline или функции #define? Inline у меня в Visual C++ 8 все равно обычная функция - значит, речь идет о рекурсивной функции. С #define ничего не вышло - компилятор не захотел раскрыть рекурсию и реализовать расчет по образу шаблона.

Интересно бы услышать еще какие-нибудь другие технологии на С++ без ассемблера!

Автор: zim22 10.7.2009, 12:20
Цитата(avnemchenko @  10.7.2009,  12:09 Найти цитируемый пост)
акие есть различные технологии реализации расчета факториала в С++

развлекайтесь
http://www.luschny.de/math/factorial/FastFactorialFunctions.htm

Автор: avnemchenko 10.7.2009, 12:24
Цитата

http://www.luschny.de/math/factorial/FastF...alFunctions.htm 

Интересно! Но что-то у меня там не открываются ссылки...
Но это и не важно - я говорю не об алгоритмах, а о ТЕХНОЛОГИЯХ. Я использовал три - циклы, рекурсия и шаблоны. Можно ли сюда чего добавить?

Автор: azesmcar 10.7.2009, 12:25
http://forum.vingrad.ru/forum/topic-262993.html

Автор: avnemchenko 10.7.2009, 12:31
Цитата(azesmcar @ 10.7.2009,  12:25)
http://forum.vingrad.ru/forum/topic-262993.html

Ой! Я эту тему поиском почему-то не нашел ... Спасибо!

Автор: Lazin 10.7.2009, 12:58
Цитата(avnemchenko @  10.7.2009,  12:24 Найти цитируемый пост)
ТЕХНОЛОГИЯХ

это 3 реализации одного и того-же алгоритма

Автор: Леопольд 10.7.2009, 21:13
Теперь, видимо, надо будет "собрать разные способы реализации" теоремы Пифагора smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)