Название: факториал числа не больше 12 Отправлено: PavelDart от Март 13, 2010, 01:46 Блин, мелочь, но не могу разобраться в чём загвоздка.
Код
при n>12 выдаёт -2.14748e+09 - чего явно не может быть. Название: Re: факториал числа не больше 12 Отправлено: KuZ от Март 13, 2010, 02:04 Скорей всего, метод возвращает значение типа инт, у тебя оно не влазит. На дабл поменяй
Название: Re: факториал числа не больше 12 Отправлено: hackoff от Март 13, 2010, 04:42 а лучше long double :)
Название: Re: факториал числа не больше 12 Отправлено: PavelDart от Март 13, 2010, 06:38 Скорей всего, метод возвращает значение типа инт, у тебя оно не влазит. На дабл поменяй Нашёл информацию, что можно поменять с помощью type_specifier function_name(type _argument); куда прописывать - непонятно. p.s. пишу в Designer Название: Re: факториал числа не больше 12 Отправлено: zoro86 от Март 13, 2010, 08:41 так попробуй
double Form2::fact(double n) { double ret=1; double zdoub; int j; zdoub=1; if (n==0) ret=1; else for(j=1; j<=n; j++) { ret=ret*zdoub; zdoub++; } return ret; } Название: Re: факториал числа не больше 12 Отправлено: JayFOX от Март 13, 2010, 10:31 Думаю, не стоить тратить столько строчек кода, хотя это непринципиально.
Код: double f(double x) Название: Re: факториал числа не больше 12 Отправлено: MoPDoBoPoT от Март 13, 2010, 13:41 Код: double f(double x) Или я старых книг начитался, и все не так (: Название: Re: факториал числа не больше 12 Отправлено: JayFOX от Март 13, 2010, 14:22 Проверку на отрицательность можно сделать изменив тест на x>0, ну давайте тогда сделаем проверку на то что число натуральное)))
А про рекурсию - какой критерий её уместности, программист принимает решение какие средства ему использовать, и что плохого в том что она есть, конечно если стек вызовов искусственно ограничен. Нету критериев "мега огород" и "явно неуместна", ИМХО конечно. Название: Re: факториал числа не больше 12 Отправлено: npkitsul от Март 13, 2010, 15:12 Код: double f(double x) Тогда ::) : Код: double f(double x) во-вторых, рекурсия здесь неуместна, это явно не тот случае, где она нужна. Рекурсию используют, где нельзя обойтись циклом или где без рекурсии будет "мега огород" (это я про императивные языки программирования, а не про логические/функциональные). Или я старых книг начитался, и все не так (: Парадоксально, но не так. Классическая и одна из первых оптимизаций в компиляторах, tail recursion elimination (http://en.wikipedia.org/wiki/Tail_recursion , http://www.cs.hamilton.edu/~bailey/pubs/techreps/TR-2001-2.pdf), автоматически преобразует эту рекурсию в цикл похожий на пример вверху. :-\ Название: Re: факториал числа не больше 12 Отправлено: SimpleSunny от Март 13, 2010, 17:39 Парадоксально, но не так. Классическая и одна из первых оптимизаций в компиляторах, tail recursion elimination (http://en.wikipedia.org/wiki/Tail_recursion , http://www.cs.hamilton.edu/~bailey/pubs/techreps/TR-2001-2.pdf), автоматически преобразует эту рекурсию в цикл похожий на пример вверху. Хвостовая рекурсия не входит в стандарт языка С++, поэтому компиляторы не обязаны ее поддерживать. А в следствии этого можно будет напороться на грабли в будущем: при переносе на другие платформы, при более сложном варианте, когда компилятор отчего-то не захочет оптимизировать, /etc. Поэтому в таких случаях разумней компилятору явно указывать, что будет цикл, а не рекурсия, тем самым облегчая себе жизнь в будущем. Название: Re: факториал числа не больше 12 Отправлено: npkitsul от Март 13, 2010, 18:17 Хвостовая рекурсия не входит в стандарт языка С++, поэтому компиляторы не обязаны ее поддерживать. А в следствии этого можно будет напороться на грабли в будущем: при переносе на другие платформы, Все неигрушечные компиляторы её поддерживают!!! Притом в промежуточном коде (e.g. RTL в gcc) независящем от платформы. Вот как в gcc: http://www.dis.com/gnu/gccint/Passes.html при более сложном варианте, когда компилятор отчего-то не захочет оптимизировать, /etc. Поэтому в таких случаях разумней компилятору явно указывать, что будет цикл, а не рекурсия, тем самым облегчая себе жизнь в будущем. Например врубив --debug :), все или почти все оптимизации отключаются... Название: Re: факториал числа не больше 12 Отправлено: PavelDart от Март 13, 2010, 19:59 так попробуй double Form2::fact(double n) Мда... ) Всё, как обычно, оказалось логично и просто. По поводу рекурсии, согласен с тем, что при отсутствии ограничений на стек - предпочтительнее рекурсия. Спасибо всем за помощь. |