imho.ws |
![]() |
![]() |
![]() |
# 1 |
Guest
Сообщения: n/a
|
![]()
Задача заключается в следующем: определить н-факториал для числа, введенного с клавиатуры.должен использоваться цикл 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. Подскажите пожалуйста, уж очень хочеться решить мне эту задачку ![]() |
![]() |
# 2 |
СуперМод
IMHO Консультант 2005-2009 Регистрация: 14.08.2002
Адрес: Московская ПЛ, ракетный отс
Пол: Male
Сообщения: 14 515
![]() |
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). Паскалем не владею, а то и готовую программку нарисовать мог бы...
__________________
Не засоряйте форум "спасибами"! Для выражения благодарности существуют ПС и репутация! Соблюдайте Правила! Распространенье наше по планете Особенно заметно вдалеке: В общественном парижском туалете Есть надписи на русском языке В. Высоцкий |
![]() |
![]() |
# 3 | |
Full Member
Регистрация: 11.12.2002
Сообщения: 864
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
http://en.literateprograms.org/Factorial_(Pascal)
обрати внимание, что Цитата:
Последний раз редактировалось crawler; 20.07.2008 в 23:12. |
|
![]() |
![]() |
# 4 | ||
Guest
Сообщения: n/a
|
Жаль, что while/do (это извращение) - факториал всегда вычисляется рекурсивной функцией - это классика
![]() Странно, что над вами так издеваются добавлено через 6 минут Цитата:
а Цитата:
![]() |
||
![]() |
# 6 |
Full Member
Регистрация: 11.12.2002
Сообщения: 864
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
да, в учебных целях лучше использовать longint. Цикл for очень просто переводится в while/do. Разница между ними чисто синтаксическая. Смотри совет Borland - там все написано.
Есть разница между значением и представлением. При представлении факториала вещественным числом можно получать значения до 170! , при longint - до 13! Видим разницу - перестаем чесать репу ![]() Последний раз редактировалось crawler; 22.07.2008 в 20:29. |
![]() |
![]() |
# 9 |
мод
IMHO Кодер-200(6,7,8) Регистрация: 29.03.2003
Адрес: Saint-Petersburg, Russia
Пол: Male
Сообщения: 2 734
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Ой, с чего это вдруг??? Рекурсия очень мощный, удобный и понятный инструмент. И, как правильно было замечено, факториал это классический случай где это наиболее просто и понятно применяется.
__________________
Я делаю Линукс! Присоединяйтесь к свободным людям! Связаться со мной всегда можно по джабберу: Hubbitus@jabber.ru Pahan-Hubbitus. |
![]() |
![]() |
# 10 | |
::VIP::
Регистрация: 09.09.2002
Адрес: Kiev
Пол: Male
Сообщения: 1 150
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Цитата:
не будем забывать о том, что рекурсия - еще и ресурсоемкий инструмент. и факториал - это как раз антипример использования рекурсии, поскольку именно ТУТ ее применять нельзя. почему? в случае цикла мы для любого N имеем две переменные, а в случае рекурсии - мы будем иметь N копий всех локальных переменных в стеке. не говоря уж о том, что отладка рекурсивной функции - тоже то еще удовольствие... как по мне (тут я полностью солидарен с tv6), рекурсию можно и нужно использовать только там, где без нее действительно нельзя обойтись - в работе с деревьями, например. во всех остальных местах стоит пользоваться инструментами попроще и подешевле.
__________________
Great minds discuss ideas. Average minds discuss events. Small minds discuss people. Последний раз редактировалось BorLase; 24.07.2008 в 12:21. |
|
![]() |
![]() |
# 11 |
мод
IMHO Кодер-200(6,7,8) Регистрация: 29.03.2003
Адрес: Saint-Petersburg, Russia
Пол: Male
Сообщения: 2 734
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
BorLase, еще раз, я НЕ говорил что он самый оптимальный по производительности, перечтите, я говорил что УДОБНЫЙ и ПОНЯТНЫЙ, еще добавлю что часто очень наглядный.
Для обхода деревьев тоже зачастую рекурсия не необходима. Более того, почти всегда, полагаю ее можно заменить циклом, как и часто в обратном направлении (в подобных задачах). Ну а то что переменные хранятся в стеке, ну да, конечно. Вы еще начните рассказывать про стоимость вызова функции, стоимость короткого перехода и теоретическую возможность переполнения стека. А я Вам на такую оптимизацию скажу что лучше наглядный код, если приложение не оптимизируется под экстремальные условия калькулятора или пишется достаточно низкоуровневая библиотека.
__________________
Я делаю Линукс! Присоединяйтесь к свободным людям! Связаться со мной всегда можно по джабберу: Hubbitus@jabber.ru Pahan-Hubbitus. |
![]() |
![]() |
# 12 |
::VIP::
Регистрация: 09.09.2002
Адрес: Kiev
Пол: Male
Сообщения: 1 150
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
честно говоря, с трудом представляю, как можно оформить обход дерева циклом... разве что эмулируя ту же рекурсию (хранить ноды в массиве и тд) - получим тот же хрен, только в профиль
впрочем, будучи согласен в главном - что наглядный код лучше - наверно, добавлю только, что понятие наглядности и понятности для каждого свое ![]() кому-то кажется понятней вычисление факториала циклом, кому-то рекурсией хотя, кажется, это уже оффтоп.
__________________
Great minds discuss ideas. Average minds discuss events. Small minds discuss people. |
![]() |
![]() |
# 14 |
Registered User
Регистрация: 27.03.2002
Адрес: дома
Сообщения: 1 660
![]() ![]() |
Хоть и оффтоп но не могу стерпеть )) Замечу как студент-информатик-теоретик. Доказано что рекурсия и итеративные методы одинаково сильны, есть методика формального перевода одного в другое. Рекурсия красива, но трудно поддаётся анализу. Рекурсия это большой подводный камень для молодых программистов, например рекурсивый расчёт чисел фибоначчи тратит действительно экспоциональное время (то есть с ростом числа на 1 время будет удваиваться). Для решения этой проблематики можно пользоваться динамическим программированием (сохранять результаты рекурсионных вызовов в массиве). Тогда остаётся и наглядность и скорость. Помоему, если можно избежать рекурсии, а в этом случае это просто, то нужно избегать её.
__________________
Всё будет хорошо! Последний раз редактировалось Stasik; 28.07.2008 в 00:08. |
![]() |
![]() |
# 15 | |
::VIP::
Регистрация: 09.09.2002
Адрес: Kiev
Пол: Male
Сообщения: 1 150
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
насколько мне помнится основной постулат программирования, закодить можно все, пользуясь только тремя конструкциями: следование-условие-повторение
![]() Цитата:
__________________
Great minds discuss ideas. Average minds discuss events. Small minds discuss people. |
|
![]() |