



Study with the several resources on Docsity
Earn points by helping other students or get them with a premium plan
Prepare for your exams
Study with the several resources on Docsity
Earn points to download
Earn points by helping other students or get them with a premium plan
some files about exercices in python
Typology: Exercises
1 / 6
This page cannot be seen from the preview
Don't miss anything!




Exercice 1 (^) Montrons que la fonction f retourne un résultat pour tout n ∈ N.
( n +11 p ) = f ◦ · · · ◦ f ︸ ︷︷ ︸ p − 1 fois
f est donc définie sur ~ 0 , 89 et constante égale à 91 sur cet intervalle. Cette fonction est connue sous le nom de fonction 91 de McCarthy.
Exercice 2 (^) Montrons par récurrence sur n que g ( n ) est calculable et que g ( n ) ∈ ~ 0 , n .
Montrons maintenant par récurrence sur n ∈ N que g ( n ) =
⌊ (^) n + 1 α
, avec α =
⌊ (^) n α
et g ( n ) = n −
⌊ (^) p + 1 α
n − p + 1 α
Sachant que p 6 n α < p + 1 et que α −
α = 1, on obtient l’encadrement : p −
α 6 n − p + 1 α < p + 1.
Sachant que 0 <^1 α < 1, on a donc : p − 1 < n − p^ + 1 α < p + 1 et p < n^ + 1 α < p + 2. Traitons alors deux cas.
⌊ (^) n + 1 α
= p et n − p + 1 α <^
α −
α
( p + 1) − 1 = p donc
n − p + 1 α
= p.
⌊ (^) n + 1 α
= p + 1 et n − p + 1 α
α −
α
( p + 1) − 1 = p donc
n − p + 1 α
= p + 1.
(On ne peut avoir l’égalité n + 1 α = p + 1 car α est irrationnel.)
Dans les deux cas, on a bien
n − p + 1 α
⌊ (^) n + 1 α
, soit g ( n ) =
⌊ (^) n + 1 α
Exercice 3 (^) Si n = 0 ou n = 1 il n’y a rien à calculer ; si n > 2 on a b n/ 2 c < n et d n/ 2 e < n , ce qui assure la terminaison de la fonction. D’où :
def power(a, n): if n == 0: return 1 elif n == 1: return a return power(a, n//2) * power(a, n−n//2)
Notons C( n ) le nombre de multiplications effectuées pour calculer an. On dispose des relations :
C(0) = C(1) = 0 et C( n ) = C(b n/ 2 c) + C(d n/ 2 e) + 1_._
Montrons par récurrence sur n > 1 que C( n ) = n − 1 :
Jean-Pierre Becirspahic
2.2 informatique commune
C( n ) = b n/ 2 c − 1 + d n/ 2 e − 1 + 1 = n − 1
ce qui prouve le résultat au rang n.
Autrement dit, cette version n’apporte rien comparé à un algorithme qui exploiterait la relation : an^ = a × an −^1. Cependant, la remarque de l’énoncé permet de modifier la fonction initiale pour écrire : def power(a, n): if n == 0: return 1 elif n == 1: return a x = power(a, n//2) if n % 2 == 0: return x * x else : return x * x * a
On dispose cette fois des relations : C(0) = C(1) = 0 et C(b n/ 2 c) + 1 6 C( n ) 6 C(b n/ 2 c) + 2. Montrons par récurrence sur n > 1 que C( n ) 6 2 log n :
C( n ) 6 2 logb n/ 2 c + 2 6 2 log( n/ 2) + 2 = 2 log n
ce qui prouve le résultat au rang n.
Ainsi, cet algorithme est de coût logarithmique ; il porte le nom d’algorithme d’ exponentiation rapide.
Exercice 4
def numerote(x, y): if x == 0 and y == 0: return 0 if y > 0: return 1 + numerote(x+1, y−1) return 1 + numerote(0, x−1)
def reciproque(n): if n == 0: return (0, 0) (x, y) = reciproque(n−1) if x > 0: return (x−1, y+1) return (y+1, 0)
Exercice 5 a) Considérons la valeur minimale tk du tableau. Si k = 0 alors t 1 = t 0 donc t 1 est un minimum local ; si k = n − 1 alors tn − 2 = tn − 1 donc tn − 2 est un minimum local. Dans les autres cas tk est un minimum local. b) On procède à une recherche dichotomique en considérant tk avec k = b n/ 2 c :
2.4 informatique commune
Exercice 7 (^) Une version simple (mais peu économique) de définir la fonction circle consiste à écrire :
import matplotlib.pyplot as plt import numpy as np def circle(coords, r): X, Y = [], [] for t in range (101): X.append(coords[0]+rnp.cos(tnp.pi/50)) Y.append(coords[1]+rnp.sin(tnp.pi/50)) plt.plot(X, Y, 'b')
On peut alors définir récursivement la fonction bubble1 de la façon suivante :
def bubble1(n, x=0, y=0, r=8): circle([x, y], r) if n > 1: bubble1(n−1, x+3*r/2, y, r/2) bubble1(n−1, x, y− 3 *r/2, r/2)
Pour définir la fonction bubble2, on ajoute un paramètre supplémentaire qui indique la direction (nord, ouest, sud, est) de l’expansion.
def bubble2(n, x=0, y=0, r=8, d=''): circle([x, y], r) if n > 1: if d != 's': bubble2(n−1, x, y+3r/2, r/2, 'n') if d != 'w': bubble2(n−1, x+3r/2, y, r/2, 'e') if d != 'n': bubble2(n−1, x, y− 3 *r/2, r/2, 's') if d != 'e': bubble2(n−1, x− 3 *r/2, y, r/2, 'w')
Exercice 8 (^) On peut définir la fonction polygon à l’aide de la fonction fill qui colorie l’intérieur d’une ligne polygonale :
def polygon(*args): X, Y = [], [] for arg in args: X.append(arg[0]) Y.append(arg[1]) plt.fill(X, Y, 'b')
Pour obtenir les approximations souhaitées du triangle de Sierpiński on définit alors la fonction suivante :
Corrigé des exercices 2.
from numpy import sqrt
def sierpinski(n, a=[0, 0], b=[1, 0], c=[.5, sqrt(3)/2]): if n == 1: polygon(a, b, c) else : u = [(b[0]+c[0])/2, (b[1]+c[1])/2] v = [(c[0]+a[0])/2, (c[1]+a[1])/2] w = [(a[0]+b[0])/2, (a[1]+b[1])/2] sierpinski(n−1, a, w, v) sierpinski(n−1, w, b, u) sierpinski(n−1, v, u, c)
a (^) b
c
v u
w
Figure 1 – La position relative des points u, v, w en fonction de a, b, c.
Figure 2 – Le résultat de bubble2(7).
Jean-Pierre Becirspahic