import sys
sys.setrecursionlimit(20)
import time
import random

def sommeArithRec(n,a,r):
    if n==1 :
        return a
    else :
        return somme(n-1,a,r)+a+(n-1)*r
    
'''jeu de test
    sommeArithRec(3,2,4) renvoie 18 (2+6+10)
    sommeArithRec(3,6,9) renvoie 45
 '''

def sommeGeoRec(n,a,q):
    if n==1 :
        return a
    else :
        return a*q**(n-1)+ sommeGeoRec(n-1,a,q)
'''jeu de test    
    sommeGeoRec(3,2,4) renvoie 42
    '''

def pgcd(a,b):
    # cas terminal
    if a%b==0:
        return b
    else :
        return pgcd(b,a%b)
    
def inverse(chaine):
    if chaine=='':
        return ''
    else:
        return inverse(chaine[1:])+chaine[0]
    
def palindrome(chaine):
    return chaine==inverse(chaine)

def factRec(n):
    if n==0:
        return 1
    else :
        return n*factRec(n-1)
    
def fact(n):
    res=1
    for i in range(1,n+1):
        res = res * i
    return res

def genereTabAlea(N,maxi):
    tab = []
    for i in range(N):
        tab.append(random.randint(0,maxi))
    return tab

def calcul(tab):
    res1=[]
    res2=[]
    t1=time.time()
    for elm in tab:
        res1.append(factRec(elm))
    t2=time.time()
    for elm in tab:
        res2.append(fact(elm))
    t3=time.time()
    return t2-t1,t3-t2

tab=genereTabAlea(100,1000)
print(calcul(tab))
''' le programme recursif est environ deux fois plus lent que l'iteratif
car le nombre d'operations elementaires est plus elev en recursif qu'un iteratif,
dans ce cas'''

def puissanceRec(x,n):
    if n==0:
        return 1
    else:
        return x*puissanceRec(x,n-1)