На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
! Правила ЧаВо (FAQ) разделов Паскаля
В этом разделе разрешено создавать только темы, в которых описано РЕШЕНИЕ какой-либо общей проблемы, или описание какого-либо аспекта языка Паскаль.
Обсуждение уже созданных тем разрешено, но только конструктивное, например указание на ошибку или уточнение имеющегося текста.

Также читать Требования к оформлению статей
Модераторы: Romtek, volvo877
  
    > Факториал числа - N!, Функция на паскале
      Факториалом числа N называют произведение всех натуральных чисел от 1 до N (включительно).
      Записывается так: N!
      Факториал 0 равен 1 - 0!=1
      Факториалы отрицательных или действительных чисел не существует (ну или не используются).
      Внимание: факториалы чисел очень быстро растут в значениях, при росте N, и даже при относительно небольших N 100 уже будут иметь огромные числовые значения.
      Так факториал 20 - 20!=2432902008176640000
      А факториал 100 будет уже из 158 цифр !!!

      Для чего нужен факториал? Довольно часто в некоторых математических формулах вычисление значений определённых функций сводятся к последовательному произведению определённых выражений, причём тем более точно вычисляется функция, чем длиннее последовательность этих выражений. В таких уравнениях из выражений можно вычленить часть, которая является факториалом числа, и, найдя его заранее, можно упростить решение. Бывают и более сложные функции того-же строения, у которых факториалы присутствуют в каждом члене.
      Вот например: sin(x)=x-(x3/3!)+(x5/5!)-(x7/7!)...
      Чем дальше выполнять вычисления, тем большей точности мы добьёмся при вычислении значения синуса угла X.

      Теперь о методах вычисления факториала.
      Простейшим методом, который наверно знают даже школьники, является простая рекурсивная функция:
      ExpandedWrap disabled
        function Factorial(n: word): LongInt;
        begin
          if n=0 then Factorial := 1 else Factorial := n*Factorial(n-1);
        end;
      Однако любой хоть немного уважающий себя программист никогда так не напишет. У этого метода есть как минимум два серьезных недостатка: во первых для вычисления факториала такая рекурсивная функция "съедает" очень большой кусок стековой памяти, что может привести к переполнению стека (особенно в сложных программах со множеством вызовов вложенных процедур или других рекурсивных алгоритмов). Вторым недостатком является довольно медленная скорость выполнения данного метода, так как вызов функции требует времени, которое можно было бы не тратить.

      Гораздо более предпочтительным является другой школьный вариант, который может показаться очень банальным, однако я бы как раз назвал его наиболее используемым:
      ExpandedWrap disabled
        function Factorial(n: word): LongInt;
        var
          fact: longint;
        begin
          fact := 1;
          if n=0 then exit;
          for n := 1 to n do
          fact := fact*n;
          Factorial := fact;
        end;
      Такой метод будет работать куда быстрее, и куда надёжнее. Однако есть другой очевидный недостаток - факториал не будет работать для чисел, больших чем 12, потому что результат даст переполнение. Однако на практике довольно редко встречаются случаи, когда нужны факториалы большей величины.

      Если же вам нужны факториалы больших чисел, то вычислять их значение можно только в строки, либо в массивы чисел, поскольку нет таких типов численных переменных, которые могли бы вместить скажем значение 2000!

      Сообщения были разделены в тему "Приблизительное вычисление факториалов"
      Сообщение отредактировано: volvo877 -
      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
      0 пользователей:


      Рейтинг@Mail.ru
      [ Script Execution time: 0,0713 ]   [ 17 queries used ]   [ Generated: 25.06.19, 08:20 GMT ]