Форум программистов, компьютерный форум, киберфорум
Turbo Pascal
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/89: Рейтинг темы: голосов - 89, средняя оценка - 4.55
0 / 0 / 0
Регистрация: 17.08.2016
Сообщений: 9

Написать функцию вычисления факториала

17.08.2016, 15:22. Показов 18848. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Написать функцию «Факториал» и программу, использующую эту функцию для вывода таблицы факториалов. Напишите пожалуйста всю задачу.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.08.2016, 15:22
Ответы с готовыми решениями:

Написать рекурсивную функцию вычисления факториала
Нужно написать рекурсивную функцию вычисления n!. Обычную функции могу написать, а куда рекурсию всунуть не понимаю... помогите...

Написать программу, которая вычисляет значение p = (для вычисления факториала использовать функцию)
Написать программу, которая вычисляет значение p =m!*(m-n)!/n! (для вычисления факториала использовать функцию).

Вычисление суммы, используя функцию вычисления факториала
Составить программу вычисления суммы (рис), используя функцию вычисления факториала натурального числа 1+\frac{1}{1\cdot...

7
 Аватар для shilko2013
257 / 234 / 185
Регистрация: 02.04.2016
Сообщений: 898
17.08.2016, 15:37
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
function Factorial(i:integer) : longint;
var r,t:integer;
begin
r:=1;
for t:=1 to i do
r := r*t;
Factorial:=r;
end;
var i:integer;
BEGIN
For i:=1 to 10 do
Writeln (i,Factorial(i):15);
END.
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7816 / 4635 / 2837
Регистрация: 22.11.2013
Сообщений: 13,157
Записей в блоге: 1
17.08.2016, 17:55
shilko2013,
но можно существенно экономнее:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function f(n: Integer): Longint;
const
  m: Integer = 1;
  r: Longint = 1;
begin
  if n<m then begin
    m:=1; r:=1;
  end;
  for m:=m+1 to n do r:=r*m;
  m:=n; f:=r;
end;
 
var i: Integer;
begin
  for i:=0 to 10 do WriteLn(i:2,f(i):8);
end.
0
2511 / 1132 / 582
Регистрация: 07.06.2014
Сообщений: 3,286
17.08.2016, 23:26
Цитата Сообщение от bormant Посмотреть сообщение
но можно существенно экономнее:
простите меня на недогадливость, а в чём состоит существенная экономия?

и зачем строчка
Pascal
1
m:=n;
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7816 / 4635 / 2837
Регистрация: 22.11.2013
Сообщений: 13,157
Записей в блоге: 1
18.08.2016, 10:19
Лучший ответ Сообщение было отмечено ZX Spectrum-128 как решение

Решение

Sergio Leone,
значения m и r сохраняются между вызовами f(), функция помнит последний вычисленный факториал (m!=r), если вызвали с n>=m, то выполняет довычисление от m, а не от 1. Строчка m:=n чтобы сохранить в m значение n -- основание факториала r --для использования при следующем вызове. Инициализированные константы (статические переменные) m и r инициализируются не при каждом вызове, а только при старте программы. Аналог
Pascal
1
2
3
4
5
6
7
8
9
10
11
var
  m: Integer;
  r: Real;
function f(n: Integer): Longint;
begin
  {...}
end;
 
begin
  m:=1; r:=1;
  {...}
При последовательных вызовах с возрастающим n вычисление очередного факториала сводится по-прежнему только к одному умножению, убедимся в этом, добавив отладочную печать:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function f(n: Integer): Longint;
const
  m: Integer = 1;
  r: Longint = 1;
begin
  if n<m then begin
    m:=1; r:=1; WriteLn('* m:=1; r:=1;');
  end;
  for m:=m+1 to n do begin r:=r*m; WriteLn('* ',m); end;
  m:=n; f:=r;
end;
 
var i: Integer;
begin
  for i:=0 to 10 do f(i);
end.
Прогон:
Code
1
2
3
4
5
6
7
8
9
10
11
* m:=1; r:=1;
* 1
* 2
* 3
* 4
* 5
* 6
* 7
* 8
* 9
* 10
2
2511 / 1132 / 582
Регистрация: 07.06.2014
Сообщений: 3,286
19.08.2016, 00:38
Цитата Сообщение от bormant Посмотреть сообщение
значения m и r сохраняются между вызовами f(), функция помнит последний вычисленный факториал (m!=r), если вызвали с n>=m, то выполняет довычисление от m, а не от 1. Строчка m:=n чтобы сохранить в m значение n -- основание факториала r --для использования при следующем вызове. Инициализированные константы (статические переменные) m и r инициализируются не при каждом вызове, а только при старте программы.
очень хитро!
я бы лично вряд ли использовал подобный код в реале (не люблю в продакшн такие хитрозакрученные и слегка неочевидные вещи), но код вызывает восхищение! Просто супер!
Спасибо!


Цитата Сообщение от bormant Посмотреть сообщение
m:=n;
bormant, а эта строчка всё таки НЕ НУЖНА!
Закомментируйте и убедитесь в этом сами!

цикл for изменяет переменную m
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7816 / 4635 / 2837
Регистрация: 22.11.2013
Сообщений: 13,157
Записей в блоге: 1
19.08.2016, 11:49
Лучший ответ Сообщение было отмечено ZX Spectrum-128 как решение

Решение

Цитата Сообщение от Sergio Leone Посмотреть сообщение
а эта строчка всё таки НЕ НУЖНА!
Закомментируйте и убедитесь в этом сами!
цикл for изменяет переменную m
Тут понимаете какая штука.

Для языка Паскаль недвусмысленно заявлено, что значение счетчика цикла for по окончании цикла не определено, если только цикл не завершился по Break. Это означает, что значение счетчика цикла может быть разным в зависимости как от реализации языка, так и от варианта оптимизации внутри конкретной реализации (например, равным последнему значению, следующему за последним значением, или вовсе начальному значению). Если какая-то реализация будет брать начальное значение счетчика из памяти в регистр, все обращения к счетчику транслировать в обращения к этому регистру, а возвращать значение из регистра в память только по Break, то, строго говоря, это не будет нарушением с точки зрения языка.

Поэтому закладываться на особенности той или иной реализации -- самое последнее дело.
Это сродни самой дорогой ошибке программирования -- ARIANE 5, с той лишь разницей, что там заложились не на языковые особенности, а на то, что начальные условия старта ARIANE 4, для которой изначально писался код, останутся неизменны.

Цитата Сообщение от Sergio Leone Посмотреть сообщение
вряд ли использовал подобный код в реале (не люблю в продакшн такие хитрозакрученные и слегка неочевидные вещи)
Наоборот, код не использует ни одной нестандартной или недокументированной возможности. Он просто помнит одно последнее значение и использует его, если возможно. В конкретно этом примере экономия невелика, но представьте вместо Longint длинную арифметику, и оценки времени сразу заиграют новыми красками :-)

Пример по сути является наводящим для организации "ленивых вычислений". Если последнее значение заменить таблицей, вычисляемой по мере необходимости, то достигается экономия на повторных вычислениях одних и тех же значений (без проверок допустимых диапазонов, только идея):
Pascal
1
2
3
4
5
6
7
8
9
10
11
function f(n: Integer): Longint;
const
  m: Integer = 1;
  r: array [0..10] of Longint = (1,1,0,0,0,0,0,0,0,0,0); {жаль синтаксис требует значения для каждого эл-та}
begin
  if n>m then begin
    for m:=m+1 to n do r[m]:=r[m-1]*m;
    m:=n;
  end;
  f:=r[n];
end;
Или варианты с промежуточными значениями и довычисление от них необходимых.

Другое дело, что если бы в продакшн подобный участок был бы действительно критичным по времени, то вместо функции была бы таблица.
2
2511 / 1132 / 582
Регистрация: 07.06.2014
Сообщений: 3,286
19.08.2016, 23:32
Цитата Сообщение от bormant Посмотреть сообщение
Для языка Паскаль недвусмысленно заявлено, что значение счетчика цикла for по окончании цикла не определено, если только цикл не завершился по Break. Это означает, что значение счетчика цикла может быть разным в зависимости как от реализации языка, так и от варианта оптимизации внутри конкретной реализации (например, равным последнему значению, следующему за последним значением, или вовсе начальному значению). Если какая-то реализация будет брать начальное значение счетчика из памяти в регистр, все обращения к счетчику транслировать в обращения к этому регистру, а возвращать значение из регистра в память только по Break, то, строго говоря, это не будет нарушением с точки зрения языка.
Согласен. Убедил.

Только, если уж говорить про универсальность, то лучше такой код (он скомилируется не только в Turbo Pascal, но и FPC и в Delphi):
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
{$J+}
function f(n: Integer): Longint;
const
  m: Integer = 1;
  r: Longint = 1;
var i : Integer;
begin
  if n<m then begin
    m:=1; r:=1;
  end;
  for i:=m+1 to n do r:=r*i;
  m:=n; f:=r;
end;
Добавлено через 44 секунды
Цитата Сообщение от bormant Посмотреть сообщение
Другое дело, что если бы в продакшн подобный участок был бы действительно критичным по времени, то вместо функции была бы таблица.
абсолютно согласен.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.08.2016, 23:32
Помогаю со студенческими работами здесь

Вычислить величины. Использовать функцию вычисления факториала
Составить программу. В задаче предполагается, используя шестизначный учебный шифр (его обозначение − b1, b2, b3, b4, b5, b6),...

Вычислить число сочетаний: С=(n!+m!)/(2(n+m)!), используя функцию вычисления факториала
Помогите решить задачи на процедуры в Turbo Pascal! Срочно нужно! Пожалуйста! 4. Составьте программу вычисления числа сочетаний:...

Вычислить выражение, используя функцию для вычисления факториала
Вычислить Fi=\sqrt{bi\, mod\, 6\, +\, 3)!}, используя функцию для вычисления факториала

Вычислить сумму: 1!+2!+3!+…+n!, используя функцию вычисления факториала числа k
1. Напишите программу вычисления суммы: 1! + 2! + 3! + … + n!, используя функцию вычисления факториала числа k. С меня...

Вычислить число сочетаний C=(n!+m!)/(2(n+m)!), используя функцию вычисления факториала
C=(n!+m!)/(2(n+m)!) используя функцию пользователя вычисления факториала числа


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
PowerShell Snippets
iNNOKENTIY21 11.11.2025
Модуль PowerShell 5. 1+ : Snippets. psm1 У меня модуль расположен в пользовательской папке модулей, по умолчанию: \Documents\WindowsPowerShell\Modules\Snippets\ А в самом низу файла-профиля. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru