PDA

Просмотр полной версии : Задачка по Паскалю(определение н-факториала)


Levilaulada
20.07.2008, 21:01
Задача заключается в следующем: определить н-факториал для числа, введенного с клавиатуры.должен использоваться цикл while/do
Не могу понять, как записать формулу:/
Program nfaktorial;
var
nfak, n, l: integer;
begin
l:= 1;
Writeln('Введите число: ');
Readln(n);
While l<n do {здесь я уже сомневаюсь:contract:}
IF (n-1) = 0 then
begin
Write('1');
End
Else
nfak:= 1*(l+1)*(l+2)*(l+3)*(..)*n {-вся загвоздка в этом..:help:}
end.

Подскажите пожалуйста, уж очень хочеться решить мне эту задачку:молись:

Borland
20.07.2008, 22:37
1. введённое число необходимо проверить (как минимум на неотрицательность).
2. перед входом в цикл присвоить nfak значение "1"
3. в цикле while (условие: n>0) всего 2 команды:
а) nfak:=nfak*n
б) n:=n-1
4. условие IF (n-1) = 0 при этом излишне: при входе в цикл с n=1 он выполнится 1 раз и выдаст правильное значение (1*1=1). При входе с n=0 цикл выполняться не будет и результатом будет 1 (тоже правильно, 0!=1)
5. Если по каким-либо специальным соображениям n менять не хочется (например, нужно его использовать при выводе результатов) - используйте в цикле l вместо n (соответственно, перед входом в цикл присвоить l:=n).

Паскалем не владею, а то и готовую программку нарисовать мог бы...

crawler
20.07.2008, 23:09
http://en.literateprograms.org/Factorial_(Pascal)

обрати внимание, что fact : real; Если работать с обычным integer то правильные результаты будешь получать только при n<8

Alexpal
20.07.2008, 23:45
Жаль, что while/do (это извращение) - факториал всегда вычисляется рекурсивной функцией - это классика ;)
Странно, что над вами так издеваются

добавлено через 6 минут
http://en.literateprograms.org/Factorial_(Pascal)
обрати внимание, что Если работать с обычным integer то правильные результаты будешь получать только при n<8

(почесав репу) Значение факториала - вещественное? Это круто.
а Usually factorials are so large that we can't use integer here
лечится изменением на longint, ну уж никак не на real, имхо :)

Levilaulada
21.07.2008, 12:39
Да никто не издевается,я книгу читаю и мне эта задача понравилась,вот и захотела во что бы ни было решить ее!там точно longint берется,а вот for do не подойдет-я метку использовать не буду

crawler
22.07.2008, 20:15
там точно longint берется,а вот for do не подойдет
да, в учебных целях лучше использовать longint. Цикл for очень просто переводится в while/do. Разница между ними чисто синтаксическая. Смотри совет Borland - там все написано.

(почесав репу) Значение факториала - вещественное?
Есть разница между значением и представлением.
При представлении факториала вещественным числом можно получать значения до 170! , при longint - до 13! Видим разницу - перестаем чесать репу ;)

Levilaulada
23.07.2008, 11:20
Всем thanks за советы, сделала свой вариант с некоторыми добавками.А я ,кстати думала что разница между while и for не синтаксическая,а логическая...

tv6
24.07.2008, 04:04
Жаль, что while/do (это извращение) - факториал всегда вычисляется рекурсивной функцией - это классика
Странно, что над вами так издеваютсяЭто вы издеваетесь. Это рекурсию обычно объясняют на примере факториала, но применять рекурсию следует только тогда, когда без неё действительно не обойтись. Вычисление факториала - вовсе не такой случай.

Hubbitus
24.07.2008, 10:49
но применять рекурсию следует только тогда, когда без неё действительно не обойтись.
Ой, с чего это вдруг??? Рекурсия очень мощный, удобный и понятный инструмент. И, как правильно было замечено, факториал это классический случай где это наиболее просто и понятно применяется.

BorLase
24.07.2008, 12:19
Ой, с чего это вдруг??? Рекурсия очень мощный, удобный и понятный инструмент. И, как правильно было замечено, факториал это классический случай где это наиболее просто и понятно применяется.

Hubbitus, спорно, очень спорно...

не будем забывать о том, что рекурсия - еще и ресурсоемкий инструмент.

и факториал - это как раз антипример использования рекурсии, поскольку именно ТУТ ее применять нельзя.

почему? в случае цикла мы для любого N имеем две переменные, а в случае рекурсии - мы будем иметь N копий всех локальных переменных в стеке.

не говоря уж о том, что отладка рекурсивной функции - тоже то еще удовольствие...

как по мне (тут я полностью солидарен с tv6), рекурсию можно и нужно использовать только там, где без нее действительно нельзя обойтись - в работе с деревьями, например. во всех остальных местах стоит пользоваться инструментами попроще и подешевле.

Hubbitus
24.07.2008, 13:13
BorLase, еще раз, я НЕ говорил что он самый оптимальный по производительности, перечтите, я говорил что УДОБНЫЙ и ПОНЯТНЫЙ, еще добавлю что часто очень наглядный.

Для обхода деревьев тоже зачастую рекурсия не необходима. Более того, почти всегда, полагаю ее можно заменить циклом, как и часто в обратном направлении (в подобных задачах). Ну а то что переменные хранятся в стеке, ну да, конечно. Вы еще начните рассказывать про стоимость вызова функции, стоимость короткого перехода и теоретическую возможность переполнения стека. А я Вам на такую оптимизацию скажу что лучше наглядный код, если приложение не оптимизируется под экстремальные условия калькулятора или пишется достаточно низкоуровневая библиотека.

BorLase
24.07.2008, 15:04
честно говоря, с трудом представляю, как можно оформить обход дерева циклом... разве что эмулируя ту же рекурсию (хранить ноды в массиве и тд) - получим тот же хрен, только в профиль

впрочем, будучи согласен в главном - что наглядный код лучше - наверно, добавлю только, что понятие наглядности и понятности для каждого свое :)

кому-то кажется понятней вычисление факториала циклом, кому-то рекурсией

хотя, кажется, это уже оффтоп.

AlgualKi
27.07.2008, 16:36
Обходить деревья без рекурсии можно. Но ненаглядно, тут я согласен.
А у кого-нибудь алгоритм вычисления Гамма-функции есть? Тот же факториел, формально :) Только для вещественных чисел...

Stasik
27.07.2008, 23:57
Хоть и оффтоп но не могу стерпеть )) Замечу как студент-информатик-теоретик. Доказано что рекурсия и итеративные методы одинаково сильны, есть методика формального перевода одного в другое. Рекурсия красива, но трудно поддаётся анализу. Рекурсия это большой подводный камень для молодых программистов, например рекурсивый расчёт чисел фибоначчи тратит действительно экспоциональное время (то есть с ростом числа на 1 время будет удваиваться). Для решения этой проблематики можно пользоваться динамическим программированием (сохранять результаты рекурсионных вызовов в массиве). Тогда остаётся и наглядность и скорость. Помоему, если можно избежать рекурсии, а в этом случае это просто, то нужно избегать её.

BorLase
28.07.2008, 00:02
Обходить деревья без рекурсии можно. Но ненаглядно, тут я согласен.
насколько мне помнится основной постулат программирования, закодить можно все, пользуясь только тремя конструкциями: следование-условие-повторение :) а "наглядность", как и "красивость", невозможно измерить количественно - так что дальнейшая дискуссия на эту тему - это прямой путь к холивар
А у кого-нибудь алгоритм вычисления Гамма-функции есть? Тот же факториел, формально :) Только для вещественных чисел...
это не оно - http://alglib.sources.ru/specialfunctions/gamma.php ?