-
Notifications
You must be signed in to change notification settings - Fork 2
/
memoisation.py
89 lines (59 loc) · 1.62 KB
/
memoisation.py
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#!/usr/bin/env python
# -*- coding: utf8 -*-
from time import sleep
def f1(n):
sleep(3)
return n + 3
print("3 secondes...")
print(f1(10)) # 13, 3 secondes après
def f2(n):
sleep(4)
return n * n
print("4 secondes...")
print(f2(10)) # 100, 4 secondes après
# Mémoïsation générique, non typée
def memo(f):
memoire = {} # dictionnaire vide, {} ou dict()
def memo_f(n):
if n not in memoire:
memoire[n] = f(n)
return memoire[n]
return memo_f
memo_f1 = memo(f1)
print("3 secondes...")
print(memo_f1(10)) # 13, 3 secondes après
print("0 secondes !")
print(memo_f1(10)) # instantanné !
# différent de ces deux lignes !
print("3 secondes...")
print(memo(f1)(10))
print("3 secondes...")
print(memo(f1)(10)) # 3 secondes aussi !
memo_f2 = memo(f2)
print("4 secondes...")
print(memo_f2(10)) # 100, 4 secondes après
print("0 secondes !")
print(memo_f2(10)) # instantanné !
# bonus : on peut utiliser la syntaxe d'un décorateur en Python :
def fibo(n):
if n <= 1: return 1
else: return fibo(n-1) + fibo(n-2)
print("Test de fibo() non mémoisée :")
for n in range(10):
print("F_{} = {}".format(n, fibo(n)))
# version plus rapide !
@memo
def fibo(n):
if n <= 1: return 1
else: return fibo(n-1) + fibo(n-2)
print("Test de fibo() mémoisée (plus rapide) :")
for n in range(10):
print("F_{} = {}".format(n, fibo(n)))
@memo
def factorielle(n):
if n <= 0: return 0
elif n == 1: return 1
else: return n * factorielle(n-1)
print("Test de factorielle() mémoisée :")
for n in range(10):
print("{}! = {}".format(n, factorielle(n)))