IMHO.WS

IMHO.WS (http://www.imho.ws/index.php)
-   Программирование (http://www.imho.ws/forumdisplay.php?f=40)
-   -   Задачка по Паскалю(определение н-факториала) (http://www.imho.ws/showthread.php?t=133897)

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 минут
Цитата:

Сообщение от crawler (Сообщение 1573965)
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

Цитата:

Сообщение от Levilaulada (Сообщение 1574039)
там точно longint берется,а вот for do не подойдет

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

Цитата:

Сообщение от Alexpal (Сообщение 1573970)
(почесав репу) Значение факториала - вещественное?

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

Levilaulada 23.07.2008 11:20

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

tv6 24.07.2008 04:04

Цитата:

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

Это вы издеваетесь. Это рекурсию обычно объясняют на примере факториала, но применять рекурсию следует только тогда, когда без неё действительно не обойтись. Вычисление факториала - вовсе не такой случай.

Hubbitus 24.07.2008 10:49

Цитата:

Сообщение от tv6 (Сообщение 1575043)
но применять рекурсию следует только тогда, когда без неё действительно не обойтись.

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

BorLase 24.07.2008 12:19

Цитата:

Сообщение от Hubbitus (Сообщение 1575089)
Ой, с чего это вдруг??? Рекурсия очень мощный, удобный и понятный инструмент. И, как правильно было замечено, факториал это классический случай где это наиболее просто и понятно применяется.

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

Цитата:

Сообщение от AlgualKi (Сообщение 1576319)
Обходить деревья без рекурсии можно. Но ненаглядно, тут я согласен.

насколько мне помнится основной постулат программирования, закодить можно все, пользуясь только тремя конструкциями: следование-условие-повторение :) а "наглядность", как и "красивость", невозможно измерить количественно - так что дальнейшая дискуссия на эту тему - это прямой путь к холивар
Цитата:

А у кого-нибудь алгоритм вычисления Гамма-функции есть? Тот же факториел, формально :) Только для вещественных чисел...
это не оно - http://alglib.sources.ru/specialfunctions/gamma.php ?


Часовой пояс GMT +4, время: 03:16.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.