![]() |
Задачка по Паскалю(определение н-факториала)
Задача заключается в следующем: определить н-факториал для числа, введенного с клавиатуры.должен использоваться цикл 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. Подскажите пожалуйста, уж очень хочеться решить мне эту задачку:молись: |
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). Паскалем не владею, а то и готовую программку нарисовать мог бы... |
http://en.literateprograms.org/Factorial_(Pascal)
обрати внимание, что Цитата:
|
Жаль, что while/do (это извращение) - факториал всегда вычисляется рекурсивной функцией - это классика ;)
Странно, что над вами так издеваются добавлено через 6 минут Цитата:
а Цитата:
|
Да никто не издевается,я книгу читаю и мне эта задача понравилась,вот и захотела во что бы ни было решить ее!там точно longint берется,а вот for do не подойдет-я метку использовать не буду
|
Цитата:
Цитата:
При представлении факториала вещественным числом можно получать значения до 170! , при longint - до 13! Видим разницу - перестаем чесать репу ;) |
Всем thanks за советы, сделала свой вариант с некоторыми добавками.А я ,кстати думала что разница между while и for не синтаксическая,а логическая...
|
Цитата:
|
Цитата:
|
Цитата:
не будем забывать о том, что рекурсия - еще и ресурсоемкий инструмент. и факториал - это как раз антипример использования рекурсии, поскольку именно ТУТ ее применять нельзя. почему? в случае цикла мы для любого N имеем две переменные, а в случае рекурсии - мы будем иметь N копий всех локальных переменных в стеке. не говоря уж о том, что отладка рекурсивной функции - тоже то еще удовольствие... как по мне (тут я полностью солидарен с tv6), рекурсию можно и нужно использовать только там, где без нее действительно нельзя обойтись - в работе с деревьями, например. во всех остальных местах стоит пользоваться инструментами попроще и подешевле. |
BorLase, еще раз, я НЕ говорил что он самый оптимальный по производительности, перечтите, я говорил что УДОБНЫЙ и ПОНЯТНЫЙ, еще добавлю что часто очень наглядный.
Для обхода деревьев тоже зачастую рекурсия не необходима. Более того, почти всегда, полагаю ее можно заменить циклом, как и часто в обратном направлении (в подобных задачах). Ну а то что переменные хранятся в стеке, ну да, конечно. Вы еще начните рассказывать про стоимость вызова функции, стоимость короткого перехода и теоретическую возможность переполнения стека. А я Вам на такую оптимизацию скажу что лучше наглядный код, если приложение не оптимизируется под экстремальные условия калькулятора или пишется достаточно низкоуровневая библиотека. |
честно говоря, с трудом представляю, как можно оформить обход дерева циклом... разве что эмулируя ту же рекурсию (хранить ноды в массиве и тд) - получим тот же хрен, только в профиль
впрочем, будучи согласен в главном - что наглядный код лучше - наверно, добавлю только, что понятие наглядности и понятности для каждого свое :) кому-то кажется понятней вычисление факториала циклом, кому-то рекурсией хотя, кажется, это уже оффтоп. |
Обходить деревья без рекурсии можно. Но ненаглядно, тут я согласен.
А у кого-нибудь алгоритм вычисления Гамма-функции есть? Тот же факториел, формально :) Только для вещественных чисел... |
Хоть и оффтоп но не могу стерпеть )) Замечу как студент-информатик-теоретик. Доказано что рекурсия и итеративные методы одинаково сильны, есть методика формального перевода одного в другое. Рекурсия красива, но трудно поддаётся анализу. Рекурсия это большой подводный камень для молодых программистов, например рекурсивый расчёт чисел фибоначчи тратит действительно экспоциональное время (то есть с ростом числа на 1 время будет удваиваться). Для решения этой проблематики можно пользоваться динамическим программированием (сохранять результаты рекурсионных вызовов в массиве). Тогда остаётся и наглядность и скорость. Помоему, если можно избежать рекурсии, а в этом случае это просто, то нужно избегать её.
|
Цитата:
Цитата:
|
Часовой пояс GMT +4, время: 03:16. |
Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.