Récursivité · Desbricoles Récursivité Complexité Références Exponentiation(pas)rapide a13 =...
Transcript of Récursivité · Desbricoles Récursivité Complexité Références Exponentiation(pas)rapide a13 =...
![Page 1: Récursivité · Desbricoles Récursivité Complexité Références Exponentiation(pas)rapide a13 = a a a a a a a a a a a a a def pow(a, b): res = 1 for i in range(b): res = res*a](https://reader036.fdocuments.us/reader036/viewer/2022081601/61109e7b2df68075c31d42fc/html5/thumbnails/1.jpg)
Des bricoles Récursivité Complexité Références
Récursivité
Émeric Tourniaire
10 décembre 2019
![Page 2: Récursivité · Desbricoles Récursivité Complexité Références Exponentiation(pas)rapide a13 = a a a a a a a a a a a a a def pow(a, b): res = 1 for i in range(b): res = res*a](https://reader036.fdocuments.us/reader036/viewer/2022081601/61109e7b2df68075c31d42fc/html5/thumbnails/2.jpg)
Des bricoles Récursivité Complexité Références
Exponentiation (pas) rapide
a13 = a ˆ a ˆ a ˆ a ˆ a ˆ a ˆ a ˆ a ˆ a ˆ a ˆ a ˆ a ˆ a
def pow(a, b):res = 1for i in range(b):
res = res*areturn res
![Page 3: Récursivité · Desbricoles Récursivité Complexité Références Exponentiation(pas)rapide a13 = a a a a a a a a a a a a a def pow(a, b): res = 1 for i in range(b): res = res*a](https://reader036.fdocuments.us/reader036/viewer/2022081601/61109e7b2df68075c31d42fc/html5/thumbnails/3.jpg)
Des bricoles Récursivité Complexité Références
Exponentiation rapide
def pow(a, b):acc = ares = 1while b > 0:
if b%2 == 1:res = res*acc
acc = acc*accb = b//2
return res
accn bn resn
a 13 1
![Page 4: Récursivité · Desbricoles Récursivité Complexité Références Exponentiation(pas)rapide a13 = a a a a a a a a a a a a a def pow(a, b): res = 1 for i in range(b): res = res*a](https://reader036.fdocuments.us/reader036/viewer/2022081601/61109e7b2df68075c31d42fc/html5/thumbnails/4.jpg)
Des bricoles Récursivité Complexité Références
Exponentiation rapide
def pow(a, b):acc = ares = 1while b > 0:
if b%2 == 1:res = res*acc
acc = acc*accb = b//2
return res
accn bn resn
a 13 1
![Page 5: Récursivité · Desbricoles Récursivité Complexité Références Exponentiation(pas)rapide a13 = a a a a a a a a a a a a a def pow(a, b): res = 1 for i in range(b): res = res*a](https://reader036.fdocuments.us/reader036/viewer/2022081601/61109e7b2df68075c31d42fc/html5/thumbnails/5.jpg)
Des bricoles Récursivité Complexité Références
Exponentiation rapide
def pow(a, b):acc = ares = 1while b > 0:
if b%2 == 1:res = res*acc
acc = acc*accb = b//2
return res
accn bn resn
a 13 1a2 6 a
![Page 6: Récursivité · Desbricoles Récursivité Complexité Références Exponentiation(pas)rapide a13 = a a a a a a a a a a a a a def pow(a, b): res = 1 for i in range(b): res = res*a](https://reader036.fdocuments.us/reader036/viewer/2022081601/61109e7b2df68075c31d42fc/html5/thumbnails/6.jpg)
Des bricoles Récursivité Complexité Références
Exponentiation rapide
def pow(a, b):acc = ares = 1while b > 0:
if b%2 == 1:res = res*acc
acc = acc*accb = b//2
return res
accn bn resn
a 13 1a2 6 aa4 3 a
![Page 7: Récursivité · Desbricoles Récursivité Complexité Références Exponentiation(pas)rapide a13 = a a a a a a a a a a a a a def pow(a, b): res = 1 for i in range(b): res = res*a](https://reader036.fdocuments.us/reader036/viewer/2022081601/61109e7b2df68075c31d42fc/html5/thumbnails/7.jpg)
Des bricoles Récursivité Complexité Références
Exponentiation rapide
def pow(a, b):acc = ares = 1while b > 0:
if b%2 == 1:res = res*acc
acc = acc*accb = b//2
return res
accn bn resn
a 13 1a2 6 aa4 3 aa8 1 a5
![Page 8: Récursivité · Desbricoles Récursivité Complexité Références Exponentiation(pas)rapide a13 = a a a a a a a a a a a a a def pow(a, b): res = 1 for i in range(b): res = res*a](https://reader036.fdocuments.us/reader036/viewer/2022081601/61109e7b2df68075c31d42fc/html5/thumbnails/8.jpg)
Des bricoles Récursivité Complexité Références
Exponentiation rapide
def pow(a, b):acc = ares = 1while b > 0:
if b%2 == 1:res = res*acc
acc = acc*accb = b//2
return res
accn bn resn
a 13 1a2 6 aa4 3 aa8 1 a5a16 0 a13
![Page 9: Récursivité · Desbricoles Récursivité Complexité Références Exponentiation(pas)rapide a13 = a a a a a a a a a a a a a def pow(a, b): res = 1 for i in range(b): res = res*a](https://reader036.fdocuments.us/reader036/viewer/2022081601/61109e7b2df68075c31d42fc/html5/thumbnails/9.jpg)
Des bricoles Récursivité Complexité Références
Exponentiation rapide
def pow(a, b):acc = ares = 1while b > 0:
if b%2 == 1:res = res*acc
acc = acc*accb = b//2
return res
accn bn resn
a 13 1a2 6 aa4 3 aa8 1 a5a16 0 a13
Invariant : res ˆ accb
![Page 10: Récursivité · Desbricoles Récursivité Complexité Références Exponentiation(pas)rapide a13 = a a a a a a a a a a a a a def pow(a, b): res = 1 for i in range(b): res = res*a](https://reader036.fdocuments.us/reader036/viewer/2022081601/61109e7b2df68075c31d42fc/html5/thumbnails/10.jpg)
Des bricoles Récursivité Complexité Références
Exponentiation rapide
def pow(a, b):acc = ares = 1while b > 0:
if b%2 == 1:res = res*acc
acc = acc*accb = b//2
return res
accn bn resn
a 13 1a2 6 aa4 3 aa8 1 a5a16 0 a13
Invariant : res ˆ accb
Optimal ?
![Page 11: Récursivité · Desbricoles Récursivité Complexité Références Exponentiation(pas)rapide a13 = a a a a a a a a a a a a a def pow(a, b): res = 1 for i in range(b): res = res*a](https://reader036.fdocuments.us/reader036/viewer/2022081601/61109e7b2df68075c31d42fc/html5/thumbnails/11.jpg)
Des bricoles Récursivité Complexité Références
Non.
![Page 12: Récursivité · Desbricoles Récursivité Complexité Références Exponentiation(pas)rapide a13 = a a a a a a a a a a a a a def pow(a, b): res = 1 for i in range(b): res = res*a](https://reader036.fdocuments.us/reader036/viewer/2022081601/61109e7b2df68075c31d42fc/html5/thumbnails/12.jpg)
Des bricoles Récursivité Complexité Références
Non.
‚ b en binaire.13 = 8 + 4 + 1 = Ę1101
2
‚ l(n) = tlg(n)u + ν(n)‚ a13 = a ˆ a4 ˆ a8
‚ a15 = a ˆ a2 ˆ a4 ˆ a83 + 3 = 6 multiplications.
‚ a15 = (a3)5 y = a3 = a ˆ a ˆ ay5 = (y ˆ y)2 ˆ y2 + 3 = 5 multiplications.
![Page 13: Récursivité · Desbricoles Récursivité Complexité Références Exponentiation(pas)rapide a13 = a a a a a a a a a a a a a def pow(a, b): res = 1 for i in range(b): res = res*a](https://reader036.fdocuments.us/reader036/viewer/2022081601/61109e7b2df68075c31d42fc/html5/thumbnails/13.jpg)
Des bricoles Récursivité Complexité Références
Non.
‚ b en binaire.13 = 8 + 4 + 1 = Ę1101
2
‚ l(n) = tlg(n)u + ν(n)‚ a13 = a ˆ a4 ˆ a8
‚ a15 = a ˆ a2 ˆ a4 ˆ a83 + 3 = 6 multiplications.
‚ a15 = (a3)5 y = a3 = a ˆ a ˆ ay5 = (y ˆ y)2 ˆ y2 + 3 = 5 multiplications.
accn bn resn
a 13 1a2 6 aa4 3 aa8 1 a5a16 0 a13
![Page 14: Récursivité · Desbricoles Récursivité Complexité Références Exponentiation(pas)rapide a13 = a a a a a a a a a a a a a def pow(a, b): res = 1 for i in range(b): res = res*a](https://reader036.fdocuments.us/reader036/viewer/2022081601/61109e7b2df68075c31d42fc/html5/thumbnails/14.jpg)
Des bricoles Récursivité Complexité Références
Non.
‚ b en binaire.13 = 8 + 4 + 1 = Ę1101
2
‚ l(n) = tlg(n)u + ν(n)‚ a13 = a ˆ a4 ˆ a8
‚ a15 = a ˆ a2 ˆ a4 ˆ a83 + 3 = 6 multiplications.
‚ a15 = (a3)5 y = a3 = a ˆ a ˆ ay5 = (y ˆ y)2 ˆ y2 + 3 = 5 multiplications.
accn bn resn
a 13 1 1a2 6 a 0a4 3 a 1a8 1 a5 1a16 0 a13
![Page 15: Récursivité · Desbricoles Récursivité Complexité Références Exponentiation(pas)rapide a13 = a a a a a a a a a a a a a def pow(a, b): res = 1 for i in range(b): res = res*a](https://reader036.fdocuments.us/reader036/viewer/2022081601/61109e7b2df68075c31d42fc/html5/thumbnails/15.jpg)
Des bricoles Récursivité Complexité Références
Non.
‚ b en binaire.13 = 8 + 4 + 1 = Ę1101
2
‚ l(n) = tlg(n)u + ν(n)‚ a13 = a ˆ a4 ˆ a8
‚ a15 = a ˆ a2 ˆ a4 ˆ a83 + 3 = 6 multiplications.
‚ a15 = (a3)5 y = a3 = a ˆ a ˆ ay5 = (y ˆ y)2 ˆ y2 + 3 = 5 multiplications.
accn bn resn
a 13 1 2a2 6 a 1a4 3 a 2a8 1 a5 1
0 a13
![Page 16: Récursivité · Desbricoles Récursivité Complexité Références Exponentiation(pas)rapide a13 = a a a a a a a a a a a a a def pow(a, b): res = 1 for i in range(b): res = res*a](https://reader036.fdocuments.us/reader036/viewer/2022081601/61109e7b2df68075c31d42fc/html5/thumbnails/16.jpg)
Des bricoles Récursivité Complexité Références
Non.
‚ b en binaire.13 = 8 + 4 + 1 = Ę1101
2
‚ l(n) = tlg(n)u + ν(n)
‚ a13 = a ˆ a4 ˆ a8
‚ a15 = a ˆ a2 ˆ a4 ˆ a83 + 3 = 6 multiplications.
‚ a15 = (a3)5 y = a3 = a ˆ a ˆ ay5 = (y ˆ y)2 ˆ y2 + 3 = 5 multiplications.
accn bn resn
a 13 1 2a2 6 a 1a4 3 a 2a8 1 a5 1
0 a13
![Page 17: Récursivité · Desbricoles Récursivité Complexité Références Exponentiation(pas)rapide a13 = a a a a a a a a a a a a a def pow(a, b): res = 1 for i in range(b): res = res*a](https://reader036.fdocuments.us/reader036/viewer/2022081601/61109e7b2df68075c31d42fc/html5/thumbnails/17.jpg)
Des bricoles Récursivité Complexité Références
Non.
‚ b en binaire.13 = 8 + 4 + 1 = Ę1101
2
‚ l(n) = tlg(n)u + ν(n)‚ a13 = a ˆ a4 ˆ a8
‚ a15 = a ˆ a2 ˆ a4 ˆ a83 + 3 = 6 multiplications.
‚ a15 = (a3)5 y = a3 = a ˆ a ˆ ay5 = (y ˆ y)2 ˆ y2 + 3 = 5 multiplications.
![Page 18: Récursivité · Desbricoles Récursivité Complexité Références Exponentiation(pas)rapide a13 = a a a a a a a a a a a a a def pow(a, b): res = 1 for i in range(b): res = res*a](https://reader036.fdocuments.us/reader036/viewer/2022081601/61109e7b2df68075c31d42fc/html5/thumbnails/18.jpg)
Des bricoles Récursivité Complexité Références
Non.
‚ b en binaire.13 = 8 + 4 + 1 = Ę1101
2
‚ l(n) = tlg(n)u + ν(n)‚ a13 = a ˆ a4 ˆ a8
‚ a15 = a ˆ a2 ˆ a4 ˆ a83 + 3 = 6 multiplications.
‚ a15 = (a3)5 y = a3 = a ˆ a ˆ ay5 = (y ˆ y)2 ˆ y2 + 3 = 5 multiplications.
![Page 19: Récursivité · Desbricoles Récursivité Complexité Références Exponentiation(pas)rapide a13 = a a a a a a a a a a a a a def pow(a, b): res = 1 for i in range(b): res = res*a](https://reader036.fdocuments.us/reader036/viewer/2022081601/61109e7b2df68075c31d42fc/html5/thumbnails/19.jpg)
Des bricoles Récursivité Complexité Références
Non.
Several authors have published statements (without proof) thatthe binary method actually gives the minimum possible number ofmultiplications. But that is not true.
(D. E. Knuth, AoCP, V. 2, ed 3, 4.6.3)
![Page 20: Récursivité · Desbricoles Récursivité Complexité Références Exponentiation(pas)rapide a13 = a a a a a a a a a a a a a def pow(a, b): res = 1 for i in range(b): res = res*a](https://reader036.fdocuments.us/reader036/viewer/2022081601/61109e7b2df68075c31d42fc/html5/thumbnails/20.jpg)
Des bricoles Récursivité Complexité Références
Non.
Several authors have published statements (without proof) thatthe binary method actually gives the minimum possible number ofmultiplications. But that is not true.
(D. E. Knuth, AoCP, V. 2, ed 3, 4.6.3)
![Page 21: Récursivité · Desbricoles Récursivité Complexité Références Exponentiation(pas)rapide a13 = a a a a a a a a a a a a a def pow(a, b): res = 1 for i in range(b): res = res*a](https://reader036.fdocuments.us/reader036/viewer/2022081601/61109e7b2df68075c31d42fc/html5/thumbnails/21.jpg)
Des bricoles Récursivité Complexité Références
Non.
‚ La méthode de factorisation est meilleure.
Faux (exemple, a33)
‚ l(2n) = l(n) + 1
Faux (exemple, l(191) = l(382) = 11)
![Page 22: Récursivité · Desbricoles Récursivité Complexité Références Exponentiation(pas)rapide a13 = a a a a a a a a a a a a a def pow(a, b): res = 1 for i in range(b): res = res*a](https://reader036.fdocuments.us/reader036/viewer/2022081601/61109e7b2df68075c31d42fc/html5/thumbnails/22.jpg)
Des bricoles Récursivité Complexité Références
Non.
‚ La méthode de factorisation est meilleure.Faux (exemple, a33)
‚ l(2n) = l(n) + 1
Faux (exemple, l(191) = l(382) = 11)
![Page 23: Récursivité · Desbricoles Récursivité Complexité Références Exponentiation(pas)rapide a13 = a a a a a a a a a a a a a def pow(a, b): res = 1 for i in range(b): res = res*a](https://reader036.fdocuments.us/reader036/viewer/2022081601/61109e7b2df68075c31d42fc/html5/thumbnails/23.jpg)
Des bricoles Récursivité Complexité Références
Non.
‚ La méthode de factorisation est meilleure.Faux (exemple, a33)
‚ l(2n) = l(n) + 1Faux (exemple, l(191) = l(382) = 11)
![Page 24: Récursivité · Desbricoles Récursivité Complexité Références Exponentiation(pas)rapide a13 = a a a a a a a a a a a a a def pow(a, b): res = 1 for i in range(b): res = res*a](https://reader036.fdocuments.us/reader036/viewer/2022081601/61109e7b2df68075c31d42fc/html5/thumbnails/24.jpg)
Des bricoles Récursivité Complexité Références
Méthode du paysan russe
def mult(a, b):acc = ares = 0while b>0:
if b%2 == 1:res = res+acc
acc = acc+accb = b//2
return res
![Page 25: Récursivité · Desbricoles Récursivité Complexité Références Exponentiation(pas)rapide a13 = a a a a a a a a a a a a a def pow(a, b): res = 1 for i in range(b): res = res*a](https://reader036.fdocuments.us/reader036/viewer/2022081601/61109e7b2df68075c31d42fc/html5/thumbnails/25.jpg)
Des bricoles Récursivité Complexité Références
Deux exemples simples
def f(x):return x*x
for i in range (10):print(f(i))
![Page 26: Récursivité · Desbricoles Récursivité Complexité Références Exponentiation(pas)rapide a13 = a a a a a a a a a a a a a def pow(a, b): res = 1 for i in range(b): res = res*a](https://reader036.fdocuments.us/reader036/viewer/2022081601/61109e7b2df68075c31d42fc/html5/thumbnails/26.jpg)
Des bricoles Récursivité Complexité Références
Deux exemples simples
def f(x):a = x+1return a
a = 12b = f(a)print(a, b)
![Page 27: Récursivité · Desbricoles Récursivité Complexité Références Exponentiation(pas)rapide a13 = a a a a a a a a a a a a a def pow(a, b): res = 1 for i in range(b): res = res*a](https://reader036.fdocuments.us/reader036/viewer/2022081601/61109e7b2df68075c31d42fc/html5/thumbnails/27.jpg)
Des bricoles Récursivité Complexité Références
Flot du programme
__main__
a = 12
b = f(a)
print(a, b)
A
f()
def f(x):a = x+1return a
![Page 28: Récursivité · Desbricoles Récursivité Complexité Références Exponentiation(pas)rapide a13 = a a a a a a a a a a a a a def pow(a, b): res = 1 for i in range(b): res = res*a](https://reader036.fdocuments.us/reader036/viewer/2022081601/61109e7b2df68075c31d42fc/html5/thumbnails/28.jpg)
Des bricoles Récursivité Complexité Références
Flot du programme
__main__
a = 12
b = f(a)
print(a, b)
A
f()
def f(x):a = x+1return a
![Page 29: Récursivité · Desbricoles Récursivité Complexité Références Exponentiation(pas)rapide a13 = a a a a a a a a a a a a a def pow(a, b): res = 1 for i in range(b): res = res*a](https://reader036.fdocuments.us/reader036/viewer/2022081601/61109e7b2df68075c31d42fc/html5/thumbnails/29.jpg)
Des bricoles Récursivité Complexité Références
Fonctions en cascade
def fonction(i):def f(x):
return x+ireturn f
li = [fonction(i) for i in range (10)]
![Page 30: Récursivité · Desbricoles Récursivité Complexité Références Exponentiation(pas)rapide a13 = a a a a a a a a a a a a a def pow(a, b): res = 1 for i in range(b): res = res*a](https://reader036.fdocuments.us/reader036/viewer/2022081601/61109e7b2df68075c31d42fc/html5/thumbnails/30.jpg)
Des bricoles Récursivité Complexité Références
Fonctions en cascade
def fonction(i):def f(x):
return x+ireturn f
li = [fonction(i) for i in range (10)]
![Page 31: Récursivité · Desbricoles Récursivité Complexité Références Exponentiation(pas)rapide a13 = a a a a a a a a a a a a a def pow(a, b): res = 1 for i in range(b): res = res*a](https://reader036.fdocuments.us/reader036/viewer/2022081601/61109e7b2df68075c31d42fc/html5/thumbnails/31.jpg)
Des bricoles Récursivité Complexité Références
Fonctions en cascade
def fonction(i):if i == 0:
return identitedef f(x):
return li[i´1](x)+1return f
li = [fonction(i) for i in range (1000)]
li [0](5) ? li [500](5) ? li [1000](1) ?
![Page 32: Récursivité · Desbricoles Récursivité Complexité Références Exponentiation(pas)rapide a13 = a a a a a a a a a a a a a def pow(a, b): res = 1 for i in range(b): res = res*a](https://reader036.fdocuments.us/reader036/viewer/2022081601/61109e7b2df68075c31d42fc/html5/thumbnails/32.jpg)
Des bricoles Récursivité Complexité Références
Pile de contextes
li[10]
A
li[9]
B
li[8]
…
APile de
contextes
B…
![Page 33: Récursivité · Desbricoles Récursivité Complexité Références Exponentiation(pas)rapide a13 = a a a a a a a a a a a a a def pow(a, b): res = 1 for i in range(b): res = res*a](https://reader036.fdocuments.us/reader036/viewer/2022081601/61109e7b2df68075c31d42fc/html5/thumbnails/33.jpg)
Des bricoles Récursivité Complexité Références
Pile de contextes
li[10]
A
li[9]
B
li[8]
…
APile de
contextes
B…
![Page 34: Récursivité · Desbricoles Récursivité Complexité Références Exponentiation(pas)rapide a13 = a a a a a a a a a a a a a def pow(a, b): res = 1 for i in range(b): res = res*a](https://reader036.fdocuments.us/reader036/viewer/2022081601/61109e7b2df68075c31d42fc/html5/thumbnails/34.jpg)
Des bricoles Récursivité Complexité Références
Pile de contextes
li[10]
A
li[9]
B
li[8]
…
APile de
contextes
B
…
![Page 35: Récursivité · Desbricoles Récursivité Complexité Références Exponentiation(pas)rapide a13 = a a a a a a a a a a a a a def pow(a, b): res = 1 for i in range(b): res = res*a](https://reader036.fdocuments.us/reader036/viewer/2022081601/61109e7b2df68075c31d42fc/html5/thumbnails/35.jpg)
Des bricoles Récursivité Complexité Références
Pile de contextes
li[10]
A
li[9]
B
li[8]
…
APile de
contextes
B…
![Page 36: Récursivité · Desbricoles Récursivité Complexité Références Exponentiation(pas)rapide a13 = a a a a a a a a a a a a a def pow(a, b): res = 1 for i in range(b): res = res*a](https://reader036.fdocuments.us/reader036/viewer/2022081601/61109e7b2df68075c31d42fc/html5/thumbnails/36.jpg)
Des bricoles Récursivité Complexité Références
Définition de la récursivité
![Page 37: Récursivité · Desbricoles Récursivité Complexité Références Exponentiation(pas)rapide a13 = a a a a a a a a a a a a a def pow(a, b): res = 1 for i in range(b): res = res*a](https://reader036.fdocuments.us/reader036/viewer/2022081601/61109e7b2df68075c31d42fc/html5/thumbnails/37.jpg)
Des bricoles Récursivité Complexité Références
Définition de la récursivité
DéfinitionUne fonction est récursive si elle s’appelle elle-même
![Page 38: Récursivité · Desbricoles Récursivité Complexité Références Exponentiation(pas)rapide a13 = a a a a a a a a a a a a a def pow(a, b): res = 1 for i in range(b): res = res*a](https://reader036.fdocuments.us/reader036/viewer/2022081601/61109e7b2df68075c31d42fc/html5/thumbnails/38.jpg)
Des bricoles Récursivité Complexité Références
Définition de la récursivité
Définition bisUne fonction est récursive si elle s’appelle elle-même mais c’estmieux si elle termine (attention aux conditions initiales !).
![Page 39: Récursivité · Desbricoles Récursivité Complexité Références Exponentiation(pas)rapide a13 = a a a a a a a a a a a a a def pow(a, b): res = 1 for i in range(b): res = res*a](https://reader036.fdocuments.us/reader036/viewer/2022081601/61109e7b2df68075c31d42fc/html5/thumbnails/39.jpg)
Des bricoles Récursivité Complexité Références
Définition de la récursivité
PropriétéPour bien comprendre la récursivité, il faut bien comprendre larécursivité.
![Page 40: Récursivité · Desbricoles Récursivité Complexité Références Exponentiation(pas)rapide a13 = a a a a a a a a a a a a a def pow(a, b): res = 1 for i in range(b): res = res*a](https://reader036.fdocuments.us/reader036/viewer/2022081601/61109e7b2df68075c31d42fc/html5/thumbnails/40.jpg)
Des bricoles Récursivité Complexité Références
Définition de la récursivité
def ping ():print("Ping")pong()
def pong ():print("Pong")ping()
![Page 41: Récursivité · Desbricoles Récursivité Complexité Références Exponentiation(pas)rapide a13 = a a a a a a a a a a a a a def pow(a, b): res = 1 for i in range(b): res = res*a](https://reader036.fdocuments.us/reader036/viewer/2022081601/61109e7b2df68075c31d42fc/html5/thumbnails/41.jpg)
Des bricoles Récursivité Complexité Références
Suites récurrences
def pow(a, b):acc = ares = 1while b > 0:
if b%2 == 1:res = res*acc
acc = acc*accb = b//2
return res
![Page 42: Récursivité · Desbricoles Récursivité Complexité Références Exponentiation(pas)rapide a13 = a a a a a a a a a a a a a def pow(a, b): res = 1 for i in range(b): res = res*a](https://reader036.fdocuments.us/reader036/viewer/2022081601/61109e7b2df68075c31d42fc/html5/thumbnails/42.jpg)
Des bricoles Récursivité Complexité Références
Suites récurrences
def pow(a, b):acc = ares = 1while b > 0:
if b%2 == 1:res = res*acc
acc = acc*accb = b//2
return res
‚ bn+1 = bn//2
‚ accn+1 = acc2n
‚
#
resn+1 = resn
resn+1 = resn ˆ accn
![Page 43: Récursivité · Desbricoles Récursivité Complexité Références Exponentiation(pas)rapide a13 = a a a a a a a a a a a a a def pow(a, b): res = 1 for i in range(b): res = res*a](https://reader036.fdocuments.us/reader036/viewer/2022081601/61109e7b2df68075c31d42fc/html5/thumbnails/43.jpg)
Des bricoles Récursivité Complexité Références
Suites récurrences
def pow(a, b, res =1):if b == 0:
return resif b%2 == 1:
return pow(a*a, b//2, res*a)else:
return pow(a*a, b//2, res)
‚ bn+1 = bn//2
‚ accn+1 = acc2n
‚
#
resn+1 = resn
resn+1 = resn ˆ accn
![Page 44: Récursivité · Desbricoles Récursivité Complexité Références Exponentiation(pas)rapide a13 = a a a a a a a a a a a a a def pow(a, b): res = 1 for i in range(b): res = res*a](https://reader036.fdocuments.us/reader036/viewer/2022081601/61109e7b2df68075c31d42fc/html5/thumbnails/44.jpg)
Des bricoles Récursivité Complexité Références
Suites récurrences
def pow(a, b):if b == 0:
return 1if b%2 == 1:
return a*pow(a*a, b//2)else:
return pow(a*a, b//2)
‚ bn+1 = bn//2
‚ accn+1 = acc2n
‚
#
resn+1 = resn
resn+1 = resn ˆ accn
![Page 45: Récursivité · Desbricoles Récursivité Complexité Références Exponentiation(pas)rapide a13 = a a a a a a a a a a a a a def pow(a, b): res = 1 for i in range(b): res = res*a](https://reader036.fdocuments.us/reader036/viewer/2022081601/61109e7b2df68075c31d42fc/html5/thumbnails/45.jpg)
Des bricoles Récursivité Complexité Références
Décoration de fonctions
‚ Trace de la fonction‚ Lisibilité‚ Décorateur
def pow(a, b):if b == 0:
return 1if b%2 == 1:
return a*pow(a*a, b//2)else:
return pow(a*a, b//2)
![Page 46: Récursivité · Desbricoles Récursivité Complexité Références Exponentiation(pas)rapide a13 = a a a a a a a a a a a a a def pow(a, b): res = 1 for i in range(b): res = res*a](https://reader036.fdocuments.us/reader036/viewer/2022081601/61109e7b2df68075c31d42fc/html5/thumbnails/46.jpg)
Des bricoles Récursivité Complexité Références
Décoration de fonctions
‚ Trace de la fonction‚ Lisibilité‚ Décorateur
def pow(a, b):print(a, b)if b == 0:
return 1if b%2 == 1:
return a*pow(a*a, b//2)else:
return pow(a*a, b//2)
![Page 47: Récursivité · Desbricoles Récursivité Complexité Références Exponentiation(pas)rapide a13 = a a a a a a a a a a a a a def pow(a, b): res = 1 for i in range(b): res = res*a](https://reader036.fdocuments.us/reader036/viewer/2022081601/61109e7b2df68075c31d42fc/html5/thumbnails/47.jpg)
Des bricoles Récursivité Complexité Références
Décoration de fonctions
In: pow(3,15)3 159 781 36561 143046721 0Out: 14348907
def pow(a, b):print(a, b)if b == 0:
return 1if b%2 == 1:
return a*pow(a*a, b//2)else:
return pow(a*a, b//2)
![Page 48: Récursivité · Desbricoles Récursivité Complexité Références Exponentiation(pas)rapide a13 = a a a a a a a a a a a a a def pow(a, b): res = 1 for i in range(b): res = res*a](https://reader036.fdocuments.us/reader036/viewer/2022081601/61109e7b2df68075c31d42fc/html5/thumbnails/48.jpg)
Des bricoles Récursivité Complexité Références
Décoration de fonctions
‚ Trace de la fonction‚ Lisibilité‚ Décorateur
def madecoration(func):def wrapper(args):# Des trucsfunc(args)# D'autres trucs
return wrapper
func = madecoration(func)
![Page 49: Récursivité · Desbricoles Récursivité Complexité Références Exponentiation(pas)rapide a13 = a a a a a a a a a a a a a def pow(a, b): res = 1 for i in range(b): res = res*a](https://reader036.fdocuments.us/reader036/viewer/2022081601/61109e7b2df68075c31d42fc/html5/thumbnails/49.jpg)
Des bricoles Récursivité Complexité Références
Décoration de fonctions
def trace(func):def wrapper(*args):
print("␣"* wrapper.space , end="")print('{}␣<´␣{}'. format(func.__name__ , args))wrapper.space += 1val = func(*args)wrapper.space ´= 1print("␣"* wrapper.space , end="")print('{}␣´>␣{}'. format(func.__name__ , val))return val
wrapper.space=0return wrapper
@tracedef pow(a, b):
...
![Page 50: Récursivité · Desbricoles Récursivité Complexité Références Exponentiation(pas)rapide a13 = a a a a a a a a a a a a a def pow(a, b): res = 1 for i in range(b): res = res*a](https://reader036.fdocuments.us/reader036/viewer/2022081601/61109e7b2df68075c31d42fc/html5/thumbnails/50.jpg)
Des bricoles Récursivité Complexité Références
Décoration de fonctions
def pow(a, b):if b == 0:
return 1if b%2 == 1:
return a*pow(a*a, b//2)else:
return pow(a*a, b//2)
In: pow(2,13)pow <´ (2, 13)
pow <´ (4, 6)pow <´ (16, 3)
pow <´ (256, 1)pow <´ (65536 , 0)pow ´> 1
pow ´> 256pow ´> 4096
pow ´> 4096pow ´> 8192Out: 8192
![Page 51: Récursivité · Desbricoles Récursivité Complexité Références Exponentiation(pas)rapide a13 = a a a a a a a a a a a a a def pow(a, b): res = 1 for i in range(b): res = res*a](https://reader036.fdocuments.us/reader036/viewer/2022081601/61109e7b2df68075c31d42fc/html5/thumbnails/51.jpg)
Des bricoles Récursivité Complexité Références
Décoration de fonctions
def pow(a, b, res =1):if b == 0:
return resif b%2 == 1:
return pow(a*a, b//2, res*a)else:
return pow(a*a, b//2, res)
In: pow(2,13)pow <´ (2, 13)
pow <´ (4, 6, 2)pow <´ (16, 3, 2)
pow <´ (256, 1, 32)pow <´ (65536 , 0, 8192)pow ´> 8192
pow ´> 8192pow ´> 8192
pow ´> 8192pow ´> 8192Out: 8192
![Page 52: Récursivité · Desbricoles Récursivité Complexité Références Exponentiation(pas)rapide a13 = a a a a a a a a a a a a a def pow(a, b): res = 1 for i in range(b): res = res*a](https://reader036.fdocuments.us/reader036/viewer/2022081601/61109e7b2df68075c31d42fc/html5/thumbnails/52.jpg)
Des bricoles Récursivité Complexité Références
Décoration de fonctions
Guido Van RossumI don’t believe in recursion as the basis of all programming. This isa fundamental belief of certain computer scientists, especially thosewho love Scheme and like to teach programming by starting with a”cons” cell and recursion. But to me, seeing recursion as the basisof everything else is just a nice theoretical approach to fundamentalmathematics (turtles all the way down), not a day-to-day tool.
![Page 53: Récursivité · Desbricoles Récursivité Complexité Références Exponentiation(pas)rapide a13 = a a a a a a a a a a a a a def pow(a, b): res = 1 for i in range(b): res = res*a](https://reader036.fdocuments.us/reader036/viewer/2022081601/61109e7b2df68075c31d42fc/html5/thumbnails/53.jpg)
Des bricoles Récursivité Complexité Références
Exemples de suites
‚ Factorielle n!‚ Fibonacci Fn‚ PGCD‚ Suite de Hopfstadter‚ Suite de Ackerman
@tracedef fact(n):
if n == 0:return 1
elsereturn n*fact(n´1)
In: fact(3)fact <´ (3,)
fact <´ (2,)fact <´ (1,)
fact <´ (0,)fact ´> 1
fact ´> 1fact ´> 2
fact ´> 6Out: 6
![Page 54: Récursivité · Desbricoles Récursivité Complexité Références Exponentiation(pas)rapide a13 = a a a a a a a a a a a a a def pow(a, b): res = 1 for i in range(b): res = res*a](https://reader036.fdocuments.us/reader036/viewer/2022081601/61109e7b2df68075c31d42fc/html5/thumbnails/54.jpg)
Des bricoles Récursivité Complexité Références
Exemples de suites
‚ Factorielle n!Comment faire pour que cesoit récursif terminal ?
‚ Fibonacci Fn‚ PGCD‚ Suite de Hopfstadter‚ Suite de Ackerman
@tracedef fact(n):
if n == 0:return 1
elsereturn n*fact(n´1)
In: fact(3)fact <´ (3,)
fact <´ (2,)fact <´ (1,)
fact <´ (0,)fact ´> 1
fact ´> 1fact ´> 2
fact ´> 6Out: 6
![Page 55: Récursivité · Desbricoles Récursivité Complexité Références Exponentiation(pas)rapide a13 = a a a a a a a a a a a a a def pow(a, b): res = 1 for i in range(b): res = res*a](https://reader036.fdocuments.us/reader036/viewer/2022081601/61109e7b2df68075c31d42fc/html5/thumbnails/55.jpg)
Des bricoles Récursivité Complexité Références
Exemples de suites
‚ Factorielle n!‚ Fibonacci Fn‚ PGCD‚ Suite de Hopfstadter‚ Suite de Ackerman
def fibo(n):if n <= 1:
return 1return fibo(n´1) + fibo(n´2)
![Page 56: Récursivité · Desbricoles Récursivité Complexité Références Exponentiation(pas)rapide a13 = a a a a a a a a a a a a a def pow(a, b): res = 1 for i in range(b): res = res*a](https://reader036.fdocuments.us/reader036/viewer/2022081601/61109e7b2df68075c31d42fc/html5/thumbnails/56.jpg)
Des bricoles Récursivité Complexité Références
Exemples de suitesfi
bo´>
1fi
bo´>
2fi
bo<´
(1,)
fibo
´>
1fi
bo´>
3fi
bo´>
8fi
bo<´
(4,)
fibo
<´(3
,)fi
bo<´
(2,)
fibo
<´(1
,)fi
bo´>
1fi
bo<´
(0,)
fibo
´>
1fi
bo´>
2fi
bo<´
(1,)
fibo
´>
1fi
bo´>
3fi
bo<´
(2,)
fibo
<´(1
,)fi
bo´>
1fi
bo<´
(0,)
fibo
´>
1fi
bo´>
2fi
bo´>
5fi
bo´>
13
fibo
<´(6
,)fi
bo<´
(5,)
fibo
<´(4
,)fi
bo<´
(3,)
fibo
<´(2
,)fi
bo<´
(1,)
fibo
´>
1fi
bo<´
(0,)
fibo
´>
1fi
bo´>
2fi
bo<´
(1,)
fibo
´>
1fi
bo´>
3fi
bo<´
(2,)
fibo
<´(1
,)fi
bo´>
1fi
bo<´
(0,)
fibo
´>
1fi
bo´>
2fi
bo´>
5fi
bo<´
(3,)
fibo
<´(2
,)fi
bo<´
(1,)
fibo
´>
1fi
bo<´
(0,)
![Page 57: Récursivité · Desbricoles Récursivité Complexité Références Exponentiation(pas)rapide a13 = a a a a a a a a a a a a a def pow(a, b): res = 1 for i in range(b): res = res*a](https://reader036.fdocuments.us/reader036/viewer/2022081601/61109e7b2df68075c31d42fc/html5/thumbnails/57.jpg)
Des bricoles Récursivité Complexité Références
Exemples de suites
‚ Factorielle n!‚ Fibonacci Fn‚ PGCD‚ Suite de Hopfstadter‚ Suite de Ackerman
def pgcd(a, b):if b == 0:
return areturn pgcd(b, a%b)
![Page 58: Récursivité · Desbricoles Récursivité Complexité Références Exponentiation(pas)rapide a13 = a a a a a a a a a a a a a def pow(a, b): res = 1 for i in range(b): res = res*a](https://reader036.fdocuments.us/reader036/viewer/2022081601/61109e7b2df68075c31d42fc/html5/thumbnails/58.jpg)
Des bricoles Récursivité Complexité Références
Exemples de suites
‚ Factorielle n!‚ Fibonacci Fn‚ PGCD‚ Suite de Hopfstadter‚ Suite de Ackerman
$
’
&
’
%
Q(1) = Q(2) = 1
Q(n) =Q(n ´ Q(n ´ 1))
+Q(n ´ Q(n ´ 2))
![Page 59: Récursivité · Desbricoles Récursivité Complexité Références Exponentiation(pas)rapide a13 = a a a a a a a a a a a a a def pow(a, b): res = 1 for i in range(b): res = res*a](https://reader036.fdocuments.us/reader036/viewer/2022081601/61109e7b2df68075c31d42fc/html5/thumbnails/59.jpg)
Des bricoles Récursivité Complexité Références
Exemples de suites
‚ Factorielle n!‚ Fibonacci Fn‚ PGCD‚ Suite de Hopfstadter‚ Suite de Ackerman
$
’
&
’
%
A(0, n) = n + 1
A(m, 0) = A(m ´ 1, 1) si m ą 0
A(m, n) = A(m ´ 1,A(m, n ´ 1))
![Page 60: Récursivité · Desbricoles Récursivité Complexité Références Exponentiation(pas)rapide a13 = a a a a a a a a a a a a a def pow(a, b): res = 1 for i in range(b): res = res*a](https://reader036.fdocuments.us/reader036/viewer/2022081601/61109e7b2df68075c31d42fc/html5/thumbnails/60.jpg)
Des bricoles Récursivité Complexité Références
Tours de Hanoï
PrincipePour déplacer n disques du pic a au pic b, on déplace n ´ 1disques du pic a au c, puis on déplace le dernier disque de a à b,puis on déplace les n ´ 1 disques de c à b.
![Page 61: Récursivité · Desbricoles Récursivité Complexité Références Exponentiation(pas)rapide a13 = a a a a a a a a a a a a a def pow(a, b): res = 1 for i in range(b): res = res*a](https://reader036.fdocuments.us/reader036/viewer/2022081601/61109e7b2df68075c31d42fc/html5/thumbnails/61.jpg)
Des bricoles Récursivité Complexité Références
Tours de Hanoï
PrincipePour déplacer n disques du pic a au pic b, on déplace n ´ 1disques du pic a au c, puis on déplace le dernier disque de a à b,puis on déplace les n ´ 1 disques de c à b.
![Page 62: Récursivité · Desbricoles Récursivité Complexité Références Exponentiation(pas)rapide a13 = a a a a a a a a a a a a a def pow(a, b): res = 1 for i in range(b): res = res*a](https://reader036.fdocuments.us/reader036/viewer/2022081601/61109e7b2df68075c31d42fc/html5/thumbnails/62.jpg)
Des bricoles Récursivité Complexité Références
Tours de Hanoï
PrincipePour déplacer n disques du pic a au pic b, on déplace n ´ 1disques du pic a au c, puis on déplace le dernier disque de a à b,puis on déplace les n ´ 1 disques de c à b.
![Page 63: Récursivité · Desbricoles Récursivité Complexité Références Exponentiation(pas)rapide a13 = a a a a a a a a a a a a a def pow(a, b): res = 1 for i in range(b): res = res*a](https://reader036.fdocuments.us/reader036/viewer/2022081601/61109e7b2df68075c31d42fc/html5/thumbnails/63.jpg)
Des bricoles Récursivité Complexité Références
Tours de Hanoï
PrincipePour déplacer n disques du pic a au pic b, on déplace n ´ 1disques du pic a au c, puis on déplace le dernier disque de a à b,puis on déplace les n ´ 1 disques de c à b.
![Page 64: Récursivité · Desbricoles Récursivité Complexité Références Exponentiation(pas)rapide a13 = a a a a a a a a a a a a a def pow(a, b): res = 1 for i in range(b): res = res*a](https://reader036.fdocuments.us/reader036/viewer/2022081601/61109e7b2df68075c31d42fc/html5/thumbnails/64.jpg)
Des bricoles Récursivité Complexité Références
Tours de Hanoï
PrincipePour déplacer n disques du pic a au pic b, on déplace n ´ 1disques du pic a au c, puis on déplace le dernier disque de a à b,puis on déplace les n ´ 1 disques de c à b.
![Page 65: Récursivité · Desbricoles Récursivité Complexité Références Exponentiation(pas)rapide a13 = a a a a a a a a a a a a a def pow(a, b): res = 1 for i in range(b): res = res*a](https://reader036.fdocuments.us/reader036/viewer/2022081601/61109e7b2df68075c31d42fc/html5/thumbnails/65.jpg)
Des bricoles Récursivité Complexité Références
Tours de Hanoï
def hanoi(n, a, b):if n == 1:
print("On␣déplace␣un␣disque␣de␣{}␣vers␣{}". format(a, b))else:
hanoi(n´1, a, 6´a´b)print("On␣déplace␣un␣disque␣de␣{}␣vers␣{}". format(a, b))hanoi(n´1, 6´a´b, b)
![Page 66: Récursivité · Desbricoles Récursivité Complexité Références Exponentiation(pas)rapide a13 = a a a a a a a a a a a a a def pow(a, b): res = 1 for i in range(b): res = res*a](https://reader036.fdocuments.us/reader036/viewer/2022081601/61109e7b2df68075c31d42fc/html5/thumbnails/66.jpg)
Des bricoles Récursivité Complexité Références
Permutations
ProblèmeGénérer toutes les permutations d’une liste d’éléments ?
def permut(l1, l2):if l2 == []:
return [l1]res = []for i in l2:
res += permut(l1+[i], [k for k in l2 if k!=i])return res
![Page 67: Récursivité · Desbricoles Récursivité Complexité Références Exponentiation(pas)rapide a13 = a a a a a a a a a a a a a def pow(a, b): res = 1 for i in range(b): res = res*a](https://reader036.fdocuments.us/reader036/viewer/2022081601/61109e7b2df68075c31d42fc/html5/thumbnails/67.jpg)
Des bricoles Récursivité Complexité Références
Permutations
ProblèmeGénérer toutes les permutations d’une liste d’éléments ?def permut(l1, l2):
if l2 == []:return [l1]
res = []for i in l2:
res += permut(l1+[i], [k for k in l2 if k!=i])return res
![Page 68: Récursivité · Desbricoles Récursivité Complexité Références Exponentiation(pas)rapide a13 = a a a a a a a a a a a a a def pow(a, b): res = 1 for i in range(b): res = res*a](https://reader036.fdocuments.us/reader036/viewer/2022081601/61109e7b2df68075c31d42fc/html5/thumbnails/68.jpg)
Des bricoles Récursivité Complexité Références
Evaluation de la complexité
‚ Équation donnant C(n) en fonction de C(k) avec k ă n‚ Factorielle : C(n) = C(n ´ 1) + 1
C(n) = O(n)‚ Fibonacci : C(n) = C(n ´ 1) + C(n ´ 2)
C(n) = O(Fn)
‚ Dichotomie : C(n) = C(n/2) + 1C(n) = O(lg(n))
‚ Hanoi : C(n) = 2C(n ´ 1) + 1C(n) = O(2n)
![Page 69: Récursivité · Desbricoles Récursivité Complexité Références Exponentiation(pas)rapide a13 = a a a a a a a a a a a a a def pow(a, b): res = 1 for i in range(b): res = res*a](https://reader036.fdocuments.us/reader036/viewer/2022081601/61109e7b2df68075c31d42fc/html5/thumbnails/69.jpg)
Des bricoles Récursivité Complexité Références
Piège à complexité
‚ Coûts « cachés »
![Page 70: Récursivité · Desbricoles Récursivité Complexité Références Exponentiation(pas)rapide a13 = a a a a a a a a a a a a a def pow(a, b): res = 1 for i in range(b): res = res*a](https://reader036.fdocuments.us/reader036/viewer/2022081601/61109e7b2df68075c31d42fc/html5/thumbnails/70.jpg)
Des bricoles Récursivité Complexité Références
Piège à complexité
‚ Coûts « cachés »‚ C(n) = 1 + C(n/2)‚ C(n) = O(lg(n))
def dicho(x, l):""" Cherche si x est dans
l triée """if l en (l)==0:
return Falsek = l en (l)//2if x == l[k]:
return Trueif x < l[k]:
return dicho(x, l[:k])return dicho(x, l[k+1:])
![Page 71: Récursivité · Desbricoles Récursivité Complexité Références Exponentiation(pas)rapide a13 = a a a a a a a a a a a a a def pow(a, b): res = 1 for i in range(b): res = res*a](https://reader036.fdocuments.us/reader036/viewer/2022081601/61109e7b2df68075c31d42fc/html5/thumbnails/71.jpg)
Des bricoles Récursivité Complexité Références
Piège à complexité
‚ Coûts « cachés »‚ C(n) = 1 + n/2 + C(n/2)‚ C(n) = O(n)
def dicho(x, l):""" Cherche si x est dans
l triée """if l en (l)==0:
return Falsek = l en (l)//2if x == l[k]:
return Trueif x < l[k]:
return dicho(x, l[:k])return dicho(x, l[k+1:])
![Page 72: Récursivité · Desbricoles Récursivité Complexité Références Exponentiation(pas)rapide a13 = a a a a a a a a a a a a a def pow(a, b): res = 1 for i in range(b): res = res*a](https://reader036.fdocuments.us/reader036/viewer/2022081601/61109e7b2df68075c31d42fc/html5/thumbnails/72.jpg)
Des bricoles Récursivité Complexité Références
Piège à complexité
‚ Coûts « cachés »‚ C(n) = 1 + n/2 + C(n/2)‚ C(n) = O(n)‚ Meilleure version…
def dicho(x, l, a, b):""" Cherche si x est dans
l[a:b] triée """if b´a == 1:
return l[a] == xk = (a+b)//2if x == l[k]:
return Trueif x < l[k]:
return dicho(x, l, a, k)return dicho(x, l, k+1, b)
![Page 73: Récursivité · Desbricoles Récursivité Complexité Références Exponentiation(pas)rapide a13 = a a a a a a a a a a a a a def pow(a, b): res = 1 for i in range(b): res = res*a](https://reader036.fdocuments.us/reader036/viewer/2022081601/61109e7b2df68075c31d42fc/html5/thumbnails/73.jpg)
Des bricoles Récursivité Complexité Références
Diviser pour régner
ThéorèmeSi on a une complexité de la forme C(n) = 2 ˆ C(n/2) + O(n),alors C(n) = O(n lg n)
![Page 74: Récursivité · Desbricoles Récursivité Complexité Références Exponentiation(pas)rapide a13 = a a a a a a a a a a a a a def pow(a, b): res = 1 for i in range(b): res = res*a](https://reader036.fdocuments.us/reader036/viewer/2022081601/61109e7b2df68075c31d42fc/html5/thumbnails/74.jpg)
Des bricoles Récursivité Complexité Références
Garder du cache
def cache(func):memoire = {}def wrapper(*args):
if args not in memoire:memoire[args] = func(*args)
return memoire[args]return wrapper
![Page 75: Récursivité · Desbricoles Récursivité Complexité Références Exponentiation(pas)rapide a13 = a a a a a a a a a a a a a def pow(a, b): res = 1 for i in range(b): res = res*a](https://reader036.fdocuments.us/reader036/viewer/2022081601/61109e7b2df68075c31d42fc/html5/thumbnails/75.jpg)
Des bricoles Récursivité Complexité Références
‚ http://info-llg.fr/commun-mp/?a=cours‚ The art of Computer Programming‚ http://neopythonic.blogspot.fr/2009/04/
tail-recursion-elimination.html