Figures récursives

On peut décrire la figure suivante de façon récursive :

La figure est formée d’un cercle et de deux copies de ce cercle ayant subies une réduction d’un facteur 2, ces deux petits cercles étant tangents extérieurement au cercle initial et tels que les lignes des centres sont parallèles aux axes du repère. Ces deux petits cercles deviennent à leur tour “cercle initial” pour poursuivre la figure.

On peut traduire avec Python ce descriptif récursif de la façon suivante :

import pylab
F = pylab.gca() # F peut être vue comme un objet ’figure’

def cercle(x, y, r):
   """ cercle de centre (x,y) et de rayon r """
   # création du cercle:
   cir = pylab.Circle([x, y], radius = r, fill = False)
   # ajout du cercle à la figure :
   F.add_patch(cir)

def CerclesRec(x, y, r):
   """ construction récursive de la figure """
   cercle(x, y, r)
   if r > 1:
      CerclesRec(x+3*r/2, y, r/2)
      CerclesRec(x, y-3*r/2, r/2)

# appel de la fonction CerclesRec
CerclesRec(0, 0, 8)

# pour placer toute la figure dans un repère orthonormé :
pylab.axis('scaled')
# affichage de la figure :
pylab.show()
Qu’est ce qui garantit que cette fonction ne s’appellera qu’un nombre fini de fois ?
Dans l’appel initial, si l’on change CerclesRec(0, 0, 8) par CerclesRec(0, 0, 64), qu’obtiendra-t-on ?
Modifier le programme python précédent pour obtenir la figure suivante :

On pourra utiliser un paramètre supplémentaire pour définir la fonction récursive (abscisse du centre, ordonnée du centre, rayon du cercle, position du voisin) où position sera l’une des chaînes de caractères : haut, bas, droite, gauche.

 

Correction
import pylab
F = pylab.gca() # F peut être vue comme un objet ’figure’

def cercle(x, y, r):
   """ cercle de centre (x,y) et de rayon r """
   # création du cercle:
   cir = pylab.Circle([x, y], radius = r, fill = False)
   # ajout du cercle à la figure :
   F.add_patch(cir)

def CerclesRec(x, y, r, pos=""):
   """ construction récursive de la figure """
   cercle(x, y, r)
   if r > 1:
      if pos != "o":
         CerclesRec(x+3*r/2, y, r/2, pos = "e")
      if pos != "n":
         CerclesRec(x, y-3*r/2, r/2, pos = "s")
      if pos != "e":
         CerclesRec(x-3*r/2, y, r/2), pos = "o")
      if pos != "s":
         CerclesRec(x, y+3*r/2, r/2), pos = "n")

# appel de la fonction CerclesRec
CerclesRec(0, 0, 8)

# pour placer toute la figure dans un repère orthonormé :
pylab.axis('scaled')
# affichage de la figure :
pylab.show()
pylab.Rectangle((x,y), a, b, fill=False)  permet de définir un rectangle dont les côtés, de longueurs a et b, sont parallèles aux axes et dont le sommet “sud-ouest” a pour coordonnées (x,y).

Écrire un programme récursif pour la figure dont on donne deux étapes ci-dessous :

 

L’instruction pylab.Polygon([(xa,ya), (xb,yb), (xc,yc)], fill=False) permet de définir un triangle dont les sommets ont pour coordonnées (xa,ya)(xb,yb)(xc,yc).

Écrire un programme récursif en Python pour la figure dont on donne deux étapes ci-dessous :

 

Vous aimerez aussi...

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.