
"""
Сформувати функцію, що буде обчислювати факторіал заданого користувачем натурального числа n.

Виконав Іваненко Андрій Вадимович
"""


""" У даному випадку для визначення функції доцільніше використати ітерації ніж рекурсію, оскільки функція визначена 
через рекурсію виконується довше та займає набагато більше пам'яті за функцію визначену через ітерації. """


def factorial1(f):  # Функція обчислення факторіала заданого числа (через ітерації)
    for i in range(f - 1, 1, -1):  # Добуток заданого числа і всіх чисел, що менші за нього, але які більші за одиницю
        f *= i
    return f


def factorial2(f):  # Функція обчислення факторіала заданого числа f (через рекурсію)
    """Якщо задане число f більше за одиницю, то повертається добуток цього числа на значення функції factorial
    від числа f-1. У випадку, коли задане число не бульше за одиницю, повертається число 1."""
    if f > 1:
        return f * factorial2(f - 1)
    else:
        return 1


answer = '1'
while answer == '1':

    while True:  # Введення натурального числа n, факторіал якого буде обчислюватись
        try:
            n = int(input("Введіть натуральне число:"))
            if n > 0:
                break
            else:
                print("Вводьте правильні дані!")
        except ValueError:
            print("Вводьте правильні дані!")

    print(f"Його факторіал (визначений через ітерації) дорівнює: {factorial1(n)}.\n"
          f"Його факторіал (визначений через рекурсію) дорівнює: {factorial2(n)}.")

    answer = input("Введіть '1' для повторення:")
