Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/165: Рейтинг темы: голосов - 165, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 09.03.2021
Сообщений: 27

Факториал от числа

26.03.2021, 13:46. Показов 31289. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!
У нас есть функция, которая делает определённые действия с входными данными:

1 Берёт факториал от числа
2 Результат делит на куб входного числа
3 И получившиеся число возводит в 10 степень

Python
1
2
3
4
5
6
7
def calculating_math_func(data):
    result = 1
    for index in range(1, data + 1):
        result *= index
    result /= data ** 3
    result = result ** 10
    return result
Оптимизируйте функцию так, чтобы высчитывать факториал для одного и того же числа только один раз.
Заранее спасибо за ответ!
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.03.2021, 13:46
Ответы с готовыми решениями:

Известен факториал числа. Найти это число (факториал числа n равен 1 2 . n )
Известен факториал числа. Найти это число (факториал числа n равен 1 2 ... n ) Я написала программу, которая находит это число, но я...

Факториал некторого числа записан в eax, а нужно вывести этот факториал в ebx
Хочу сделать код факториал некторого числа записан в eax, а нужно вывести этот факториал в ebx и где-то ошибка ( не могли бы помочь...

Описать рекурсивные функции вещественного типа, вычисляющие факториал и двойной факториал заданного числа
Описать рекурсивные функции Fact(N) и Fact2(N) вещественного типа, вычисляющие значения факториала N! и двойного факториала N!!...

22
712 / 351 / 120
Регистрация: 09.12.2020
Сообщений: 918
26.03.2021, 14:12
Что тут ускорять?
Цитата Сообщение от Zaouza Посмотреть сообщение
Оптимизируйте функцию так, чтобы высчитывать факториал для одного и того же числа только один раз.
она и так считает факториал только 1 раз. Нет?

мой вариант:
3.9594086612242536e+35
0.00011181831359863281 sec
Python
1
2
3
4
5
6
7
from math import factorial, pow
 
def calc(data):
    return pow((factorial(data) / pow(data, 3)), 10)
 
 
print(calc(10))
0
Эксперт Python
 Аватар для dondublon
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,183
Записей в блоге: 6
26.03.2021, 14:15
Zaouza, используйте кеширование.
0
130 / 41 / 19
Регистрация: 31.03.2020
Сообщений: 63
26.03.2021, 14:16
Лучший ответ Сообщение было отмечено Zaouza как решение

Решение

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
def calculating_math_func(data):
    if data in factorials:  # если факториал в словаре присваеваем переменной result его значение
        result = factorials[data]
    else:
        result = 1
        for index in range(1, data + 1):
            result *= index
        factorials[data] = result  # иначе находим факториал и добавляем его значение в словарь
    result /= data ** 3
    result = result ** 10
    return result
 
 
factorials = {}  # создаем словарь всех найденных факториалов
0
Эксперт Python
 Аватар для dondublon
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,183
Записей в блоге: 6
26.03.2021, 15:14
kerty, всё равно повторение. Если нужен 50!, а в словаре имеется 49!, то не заюзает.
0
130 / 41 / 19
Регистрация: 31.03.2020
Сообщений: 63
26.03.2021, 15:17
Цитата Сообщение от Zaouza Посмотреть сообщение
Оптимизируйте функцию так, чтобы высчитывать факториал для одного и того же числа только один раз.
...
0
8 / 7 / 2
Регистрация: 29.09.2019
Сообщений: 54
26.03.2021, 15:18
сайтон?
0
Эксперт Python
 Аватар для dondublon
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,183
Записей в блоге: 6
26.03.2021, 15:41
kerty, exactly. Так для упомянутого примера 49! вы вычислите дважды.
0
130 / 41 / 19
Регистрация: 31.03.2020
Сообщений: 63
26.03.2021, 15:57
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
def calculating_math_func(data):
    for i in range(data, 0, -1):
        if i in factorials:
            result = factorials[i]
            break
    for index in range(i + 1, data + 1):
        result *= index
        factorials[index] = result
    result /= data ** 3
    result = result ** 10
    return result
 
 
factorials = {1: 1}
1
Эксперт Python
 Аватар для dondublon
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,183
Записей в блоге: 6
26.03.2021, 16:29
kerty, чёта глаза разбегаются.
А если первый запуск, factorials пустой? А что это вообще такое, глобалка?
0
130 / 41 / 19
Регистрация: 31.03.2020
Сообщений: 63
26.03.2021, 17:56
dondublon, а 14 строчка на что?
0
Эксперт Python
 Аватар для dondublon
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,183
Записей в блоге: 6
26.03.2021, 18:41
kerty, далеко глядеть.
0
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
26.03.2021, 18:54
kerty, еще так можно
Python
1
2
3
4
5
6
7
8
9
def calc_func(num, fact = {0: 1}):
    if num not in fact:
        i = max(fact)
        for j in range(i + 1, num + 1):
            fact[j] = fact[j-1] * j
    return pow(fact[num] / pow(num, 3), 10)
 
print(calc_func(10))
print(calc_func(21))
3
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
26.03.2021, 21:40
Zaouza, Задача как раз для моего шаблона, который недавно написал.
Берем Вашу функцию:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def calculating_math_func(data):
    result = 1
    for index in range(1, data + 1):
        result *= index
    result /= data ** 3
    result = result ** 10
    return result
 
print(calculating_math_func(2))       # 9.5367431640625e-07
 
print(calculating_math_func(5))       # 0.6648326359915008
 
print(calculating_math_func(7))       # 469206655775.42755
 
print(calculating_math_func(9))       # 9.340175693050364e+26
И просто вставляем в мой шаблон:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
"""
Использование класса функций Func 
    позволяет исключить затратные повторные запуски функций
    и при этом не допустить возникновение ошибок, 
    которые могут возникать при использовании глобальных переменных
    для хранения результатов работы функций
"""
 
from math import pow,sqrt
 
class Func:
    def __init__(self, func):
        self.func = func
        self.args = ()
        self.dic_res = {}            # словарь результатов для разных наборов аргументов
        self.res = None              # последний полученный результат
    def __call__(self, *args):
        self.args = args
        if self.args in self.dic_res:
            self.res = self.dic_res[self.args]
            return self.res
        else:
            self.res = self.func(*self.args)
            self.dic_res[self.args] = self.res
            return self.res
 
def calculating_math_func(data):
    result = 1
    for index in range(1, data + 1):
        result *= index
    result /= data ** 3
    result = result ** 10
    return result 
 
 
if __name__ == '__main__':
 
    calculating_math_func_F = Func(calculating_math_func)
 
    print(calculating_math_func_F(2))       # 9.5367431640625e-07
 
    print(calculating_math_func_F(5))       # 0.6648326359915008
 
    print(calculating_math_func_F(7))       # 469206655775.42755
 
    print(calculating_math_func_F(9))       # 9.340175693050364e+26
При желании можно менять содержимое функции или добавлять количество параметров (например указав степени в которые возводятся промежуточные значения, шаблон не изменится и так же будет работать.

Добавлено через 3 минуты
При этом вычисление функции при заданных параметрах, если они повторяются, будет производиться только один раз.
Вычисленные ранее значения функции будут просто браться из атрибута-словаря.

Добавлено через 5 минут
Шаблон имеет смысл использовать для любой функции, которая может многократно вычисляться при одинаковых параметрах. Такое может быть при вычислении массива результатов эксперимента.
1
Эксперт Python
1356 / 653 / 207
Регистрация: 23.03.2014
Сообщений: 3,057
26.03.2021, 21:55
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
n = 23
 
fact = 1
 
 
for i in range(1, n+1):
 
    fact = fact * i
 
 
print("The factorial of 23 is : ", end="")
 
print(fact)
1
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
27.03.2021, 00:45
Zaouza, А теперь увеличим у функции количество параметров, сделав параметрами показатели степени для первой и второй степеней внутри функции. При этом шаблон остается без изменений. Получаем те же результаты.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
"""
Использование класса функций Func 
    позволяет исключить затратные повторные запуски функций
    и при этом не допустить возникновение ошибок, 
    которые могут возникать при использовании глобальных переменных
    для хранения результатов работы функций
"""
 
from math import pow,sqrt
 
class Func:
    def __init__(self, func):
        self.func = func
        self.args = ()
        self.dic_res = {}            # словарь результатов для разных наборов аргументов
        self.res = None              # последний полученный результат
    def __call__(self, *args):
        self.args = args
        if self.args in self.dic_res:
            self.res = self.dic_res[self.args]
            return self.res
        else:
            self.res = self.func(*self.args)
            self.dic_res[self.args] = self.res
            return self.res
 
def calculating_math_func(data, n1, n2):
    result = 1
    for index in range(1, data + 1):
        result *= index
    result /= data ** n1
    result = result ** n2
    return result 
 
 
if __name__ == '__main__':
 
    calculating_math_func_F = Func(calculating_math_func)
 
    print(calculating_math_func_F(2, 3, 10))       # 9.5367431640625e-07
 
    print(calculating_math_func_F(5, 3, 10))       # 0.6648326359915008
 
    print(calculating_math_func_F(7, 3, 10))       # 469206655775.42755
 
    print(calculating_math_func_F(9, 3, 10))       # 9.340175693050364e+26
Результаты для аргументов, которые уже были вычислены, доступны из любого места программы. В том числе из других модулей.

Добавлено через 4 минуты
Не меняя шаблон, можем поменять функцию в шаблоне, и другая функция будет так же стабильно работать сохраняя результаты для различных аргументов в атрибуте-словаре экземпляра класса.
1
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
27.03.2021, 10:53
Viktorrus, В задании условие немного другое - не допустить повторное вычисление факториала, если ранее было вычислено
то есть при такой пользовательской функции
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
"""
Использование класса функций Func 
    позволяет исключить затратные повторные запуски функций
    и при этом не допустить возникновение ошибок, 
    которые могут возникать при использовании глобальных переменных
    для хранения результатов работы функций
"""
 
from math import pow,sqrt
 
class Func:
    def __init__(self, func):
        self.func = func
        self.args = ()
        self.dic_res = {}            # словарь результатов для разных наборов аргументов
        self.res = None              # последний полученный результат
    def __call__(self, *args):
        self.args = args
        if self.args in self.dic_res:
            self.res = self.dic_res[self.args]
            return self.res
        else:
            self.res = self.func(*self.args)
            self.dic_res[self.args] = self.res
            return self.res
 
def calculating_math_func(data, n1, n2):
    result = 1
    for index in range(1, data + 1):
        if index == 5:
            print(result)
        result *= index
    result /= data ** n1
    result = result ** n2
    return result 
 
 
if __name__ == '__main__':
 
    calculating_math_func_F = Func(calculating_math_func)
 
    print(calculating_math_func_F(2, 3, 10))       # 9.5367431640625e-07
 
    print(calculating_math_func_F(5, 3, 10))       # 0.6648326359915008
 
    print(calculating_math_func_F(7, 3, 10))       # 469206655775.42755
 
    print(calculating_math_func_F(9, 3, 10))       # 9.340175693050364e+26
печать result должно быть один раз
1
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
27.03.2021, 12:06
Gdez, Нет проблем. Просто выделить вычисление факториала в отдельную функцию (или взять уже имеющуюся функцию, например из numpy . Вставить эту функцию в мой шаблон и прогнать вычисление до нужного диапазона. И больше факториал не нужно будет вычислять, а результат будет браться из атрибута-словаря шаблона.
Но я подозреваю, что самая затратная функция здесь не вычисление факториала, а возведение в степень 10. И вообще название темы не совсем соответствует условию. В условии просится вычислить функцию (в которую входит факториал, но не только он).
Мое дело предложить, а там ТС пусть делает как хочет.

Добавлено через 3 минуты
Цитата Сообщение от Gdez Посмотреть сообщение
печать result должно быть один раз
Скажу честно, я не понял смысл этих слов. Затратно повторение вычислений требующих много времени, а не печать результата, когда он уже вычислен и размещен в словаре.

Добавлено через 11 минут
Gdez, Повторюсь. Идея моего шаблона состоит в том, что любые затратные вычисления, для конкретных исходных данных, производить только один раз, и помещать результаты вычислений в словарь. А затем для аналогичных исходных данных не повторять вычисления, а просто брать результат из словаря.
Причем, чем более затратны вычисления для заданных исходных данных, и чем чаще приходится повторять эти вычисления для этих наборов данных, тем эффективнее предлагаемый мной шаблон. Мне приходилось сталкиваться с функциями, время работы которых исчислялось многими минутами.

Добавлено через 7 минут
Кстати поиск в словаре по ключу питон производит с помощью хеширования. То есть очень быстро. А так, как ключами в моем шаблоне являются кортежи, то есть хешируемые объекты, то поиск нужного результата происходит быстро.

Добавлено через 22 минуты
Цитата Сообщение от Gdez Посмотреть сообщение
В задании условие немного другое - не допустить повторное вычисление факториала, если ранее было вычислено
ТС может придумать любые извращения. Моя задача быстро, и из любого места программы, получать результат работы функции в случае, если она уже вычислялась.
Я показал, как это можно сделать.
Кому это нужно, могут использовать. Пугать глобалками, при такой технологии, бессмысленно.
0
1 / 1 / 0
Регистрация: 30.04.2021
Сообщений: 4
13.05.2021, 13:30
что скажете?

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def calculating_math_func(data):
    if data in factorials:  # Если уже вычислялось
        result = factorials[data]
    else:
        result = max(factorials.values()) #  Берем самое последнее вычисленное и начинаем отсюда
        for index in range(max(factorials.keys()) + 1, data + 1):
            result *= index
            factorials[index] = result  # Заполняем словарь всем, что вычислили
    result /= data ** 3
    result = result ** 10
    return result
 
 
factorials = {1: 1}
while True:
    print(calculating_math_func(int(input('Введите число: '))))
    print(sorted(factorials.items()))  # Проверка самого себя
1
710 / 356 / 104
Регистрация: 09.02.2018
Сообщений: 805
13.05.2021, 16:44
Мне нравится. Можно было бы использовать обычный список вместо словаря, но это не принципиально.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.05.2021, 16:44
Помогаю со студенческими работами здесь

Найти факториал заданного числа (неправильный ответ при вводе числа > 13)
Дано целое число n, нужно найти n! Код составлен. Он считает правильно до 13, а после 13 выдает ложный ответ. В чем проблема? ...

Определить во сколько раз факториал числа n! больше факториала числа m!
Определить во сколько раз факториал числа n! больше факториала числа m!

Выяснить, факториал какого наибольшего числа не превосходит числа 10000
....

Определить во сколько раз факториал числа n больше числа m
Определить во сколько раз факториал числа n больше числа m

Найти все такие N(N<100),что у числа N!(факториал) сумма цифр-квадрат целого числа
Без этой задачи мне не ставят зачет и я не могу выйти на сэссию=( &quot;&quot;Найти все такие N(N&lt;100),что у числа N!(факториал) сумма...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru