imho.ws
IMHO.WS  

Вернуться   IMHO.WS > Компьютеры > Программирование
Опции темы
Старый 20.07.2008, 21:01     # 1
Levilaulada
Guest
 
Сообщения: n/a

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

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

Подскажите пожалуйста, уж очень хочеться решить мне эту задачку
 
Старый 20.07.2008, 22:37     # 2
Borland
СуперМод
IMHO Консультант 2005-2009
 
Аватар для Borland
 
Регистрация: 14.08.2002
Адрес: Московская ПЛ, ракетный отс
Пол: Male
Сообщения: 14 515

Borland - Гад и сволочь
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).

Паскалем не владею, а то и готовую программку нарисовать мог бы...
__________________
Не засоряйте форум "спасибами"! Для выражения благодарности существуют ПС и репутация! Соблюдайте Правила!
Распространенье наше по планете
Особенно заметно вдалеке:
В общественном парижском туалете
Есть надписи на русском языке

В. Высоцкий

Borland вне форума  
Старый 20.07.2008, 23:09     # 3
crawler
Full Member
 
Регистрация: 11.12.2002
Сообщения: 864

crawler Имеются все основания чтобы гордиться собойcrawler Имеются все основания чтобы гордиться собойcrawler Имеются все основания чтобы гордиться собойcrawler Имеются все основания чтобы гордиться собойcrawler Имеются все основания чтобы гордиться собойcrawler Имеются все основания чтобы гордиться собойcrawler Имеются все основания чтобы гордиться собойcrawler Имеются все основания чтобы гордиться собойcrawler Имеются все основания чтобы гордиться собойcrawler Имеются все основания чтобы гордиться собой
http://en.literateprograms.org/Factorial_(Pascal)

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

Последний раз редактировалось crawler; 20.07.2008 в 23:12.
crawler вне форума  
Старый 20.07.2008, 23:45     # 4
Alexpal
Guest
 
Сообщения: n/a

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

добавлено через 6 минут
Цитата:
Сообщение от crawler Посмотреть сообщение
http://en.literateprograms.org/Factorial_(Pascal)
обрати внимание, что Если работать с обычным integer то правильные результаты будешь получать только при n<8
(почесав репу) Значение факториала - вещественное? Это круто.
а
Цитата:
Usually factorials are so large that we can't use integer here
лечится изменением на longint, ну уж никак не на real, имхо
 
Старый 21.07.2008, 12:39     # 5
Levilaulada
Guest
 
Сообщения: n/a

Да никто не издевается,я книгу читаю и мне эта задача понравилась,вот и захотела во что бы ни было решить ее!там точно longint берется,а вот for do не подойдет-я метку использовать не буду
 
Старый 22.07.2008, 20:15     # 6
crawler
Full Member
 
Регистрация: 11.12.2002
Сообщения: 864

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

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

Последний раз редактировалось crawler; 22.07.2008 в 20:29.
crawler вне форума  
Старый 23.07.2008, 11:20     # 7
Levilaulada
Guest
 
Сообщения: n/a

Всем thanks за советы, сделала свой вариант с некоторыми добавками.А я ,кстати думала что разница между while и for не синтаксическая,а логическая...
 
Старый 24.07.2008, 04:04     # 8
tv6
Guest
 
Сообщения: n/a

Цитата:
Сообщение от Alexpal Посмотреть сообщение
Жаль, что while/do (это извращение) - факториал всегда вычисляется рекурсивной функцией - это классика
Странно, что над вами так издеваются
Это вы издеваетесь. Это рекурсию обычно объясняют на примере факториала, но применять рекурсию следует только тогда, когда без неё действительно не обойтись. Вычисление факториала - вовсе не такой случай.
 
Старый 24.07.2008, 10:49     # 9
Hubbitus
мод
IMHO Кодер-200(6,7,8)
 
Регистрация: 29.03.2003
Адрес: Saint-Petersburg, Russia
Пол: Male
Сообщения: 2 734

Hubbitus Бог с наворотамиHubbitus Бог с наворотами
Hubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотами
Цитата:
Сообщение от tv6 Посмотреть сообщение
но применять рекурсию следует только тогда, когда без неё действительно не обойтись.
Ой, с чего это вдруг??? Рекурсия очень мощный, удобный и понятный инструмент. И, как правильно было замечено, факториал это классический случай где это наиболее просто и понятно применяется.
__________________
Я делаю Линукс! Присоединяйтесь к свободным людям!

Связаться со мной всегда можно по джабберу: Hubbitus@jabber.ru
Pahan-Hubbitus.
Hubbitus вне форума  
Старый 24.07.2008, 12:19     # 10
BorLase
::VIP::
 
Аватар для BorLase
 
Регистрация: 09.09.2002
Адрес: Kiev
Пол: Male
Сообщения: 1 150

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

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

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

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

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

как по мне (тут я полностью солидарен с tv6), рекурсию можно и нужно использовать только там, где без нее действительно нельзя обойтись - в работе с деревьями, например. во всех остальных местах стоит пользоваться инструментами попроще и подешевле.
__________________
Great minds discuss ideas. Average minds discuss events. Small minds discuss people.

Последний раз редактировалось BorLase; 24.07.2008 в 12:21.
BorLase вне форума  
Старый 24.07.2008, 13:13     # 11
Hubbitus
мод
IMHO Кодер-200(6,7,8)
 
Регистрация: 29.03.2003
Адрес: Saint-Petersburg, Russia
Пол: Male
Сообщения: 2 734

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

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

Связаться со мной всегда можно по джабберу: Hubbitus@jabber.ru
Pahan-Hubbitus.
Hubbitus вне форума  
Старый 24.07.2008, 15:04     # 12
BorLase
::VIP::
 
Аватар для BorLase
 
Регистрация: 09.09.2002
Адрес: Kiev
Пол: Male
Сообщения: 1 150

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

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

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

хотя, кажется, это уже оффтоп.
__________________
Great minds discuss ideas. Average minds discuss events. Small minds discuss people.
BorLase вне форума  
Старый 27.07.2008, 16:36     # 13
AlgualKi
Junior Member
 
Регистрация: 24.06.2007
Сообщения: 121

AlgualKi Путь к славе только начался
Обходить деревья без рекурсии можно. Но ненаглядно, тут я согласен.
А у кого-нибудь алгоритм вычисления Гамма-функции есть? Тот же факториел, формально Только для вещественных чисел...
AlgualKi вне форума  
Старый 27.07.2008, 23:57     # 14
Stasik
Registered User
 
Аватар для Stasik
 
Регистрация: 27.03.2002
Адрес: дома
Сообщения: 1 660

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

Последний раз редактировалось Stasik; 28.07.2008 в 00:08.
Stasik вне форума  
Старый 28.07.2008, 00:02     # 15
BorLase
::VIP::
 
Аватар для BorLase
 
Регистрация: 09.09.2002
Адрес: Kiev
Пол: Male
Сообщения: 1 150

BorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех Гуру
Цитата:
Сообщение от AlgualKi Посмотреть сообщение
Обходить деревья без рекурсии можно. Но ненаглядно, тут я согласен.
насколько мне помнится основной постулат программирования, закодить можно все, пользуясь только тремя конструкциями: следование-условие-повторение а "наглядность", как и "красивость", невозможно измерить количественно - так что дальнейшая дискуссия на эту тему - это прямой путь к холивар
Цитата:
А у кого-нибудь алгоритм вычисления Гамма-функции есть? Тот же факториел, формально Только для вещественных чисел...
это не оно - http://alglib.sources.ru/specialfunctions/gamma.php ?
__________________
Great minds discuss ideas. Average minds discuss events. Small minds discuss people.
BorLase вне форума  


Ваши права в разделе
Вы НЕ можете создавать новые темы
Вы не можете отвечать в темах.
Вы НЕ можете прикреплять вложения
Вы НЕ можете редактировать свои сообщения

BB код Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.

Быстрый переход


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




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