#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import timeit

def iterative_factorielle (n):
    # n doit être un entier naturel
    n = abs(int(n))
    # valeur par défaut
    # 0! = 1! = 1
    resultat = 1
    # on ne traite qu'à partir de n = 2, 3, 4, ...
    if n > 1:
        for i in range(2, n + 1):
            resultat = resultat * i
        # end for
    # end if
    return resultat
# end def

def recursive_factorielle (n):
    # n doit être un entier naturel
    n = abs(int(n))
    # si n < 2 on retourne 1 puisque 0! = 1! = 1
    if n < 2: return 1
    # on utilise la récursivité (la fonction s'appelle elle-même)
    return n * recursive_factorielle(n - 1)
# end def

def test_iterative ():
    for n in range(debut, fin):
        iterative_factorielle(n)
    # end for
# end def

def test_recursive ():
    for n in range(debut, fin):
        recursive_factorielle(n)
    # end for
# end def

# tests

debut = 980
fin = debut + 10

boucles = 1000

print("calculs de factorielles de {}! à {}!".format(debut, fin))

print("sur un échantillon statistique de {} boucles :".format(boucles))

print("\ncalculs avec iterative_factorielle(n)...")

test1 = timeit.timeit(
    "test_iterative()",
    setup="from __main__ import test_iterative",
    number=boucles,
)

print("total temps iterative : {} s".format(test1))

print("\ncalculs avec recursive_factorielle(n)...")

test2 = timeit.timeit(
    "test_recursive()",
    setup="from __main__ import test_recursive",
    number=boucles,
)

print("total temps recursive : {} s".format(test2))

print("\nécart recursive - iterative : {:0.6f} s".format(test2 - test1))
