14. Факториалы.

(открыть в новой вкладке)

Условие:

Составить словарь, где ключ - это целое число (от 1 до 30 включительно), а значение - это факториал этого числа
1! = 1
2! = 1×2
5! = 1×2×3×4×5
10! = 1×2×3×...×9×10 = 9!×10
Программа спрашивает у пользователя число, и выводит его факториал. Это повторяется до тех пор, пока пользователь не ввёл -1. Причём:
• Если факториал этого числа уже как-то ранее вычислялся, то программа берёт готовое число.
• Если нет, то программа считает его от ближайшего ранее вычисленного факториала.
Нужно свести к минимуму количество операций умножения. Пример:
Пользователь ввёл 5:
> Считаем факториал 5, попутно вычисляя факториалы 4, 3 и 2. Все значения сохраняем в кэше.
Пользователь ввёл 3:
> Такой факториал мы только что сосчитали, пока считали факториал пяти, берём готовое значение из кэша.
Пользователь ввёл 7
> Такой факториал мы не считали, но знаем факториал 5. Поэтому считаем его как 5! * 6 * 7.

Код:

result_dict = {1:1}                                                        # этот словарь будем дополнять готовыми результатами, стартует уже с минимальными данными для цифры 1

number = int(input("Введите число:")    )                                  
while number > 0:                                                          # в цикле будет спрашивать о новом числе, пока не введёшь отрицательное число        
    if number in result_dict.keys(): 
        print("Для числа", number, "факториал равен", result_dict[number])
    elif number not in result_dict.keys():
        work_range = range((max(result_dict.keys()) + 1), number + 1)      # создание range, кот. будем обходить в цикле  
        composition = result_dict[max(result_dict.keys())]                 # вынимаем максимальное значение из существующего словаря
        for i in work_range:                                               # обойдём в цикле все числа в range        
            composition *= i                                               # считаем новое произведение факториала
            result_dict[i] = composition                                   # создаём ключ в словаре со значением переменной "composition"
        print("Для числа", number, "факториал равен", result_dict[number])
    number = int(input("Введите число:"))