Formation I.S.N.

Récursivité arboricole

arbre binaire

Proposer une tortue python récursive réalisant :

  • Avec n = 0 :  arbre 0
  • Avec n = 1 :  arbre 1
  • Avec n = 2 :  arbre 2
  • Avec n = 3 :  arbre 3
  • Avec n = 7 :  arbre 7
  • documentation
  • un code

On trouvera la doc sur le module turtle ici.


import turtle as tl

 
		
def arbre( hauteur, profondeur, angle  ) :
	if profondeur == 0 : 
		tl.forward(hauteur)
		tl.backward(hauteur)
	else :
		tl.forward(hauteur)
		tl.right(angle)
		arbre(hauteur/2,profondeur-1,angle)
		tl.left(2*angle)
		arbre(hauteur/2,profondeur-1,angle)
		tl.right(angle)
		tl.backward(hauteur)

tl.setheading(90) # orientation intiale de la tête : vers le haut
tl.hideturtle() # on cache la tortue
tl.speed(0)	 # on accélère la tortue
tl.color('green')
arbre(  hauteur = 50, profondeur = 3, angle = 45  ) 
tl.exitonclick() # pour  garder ouverte la fenêtre

épaisseur

Améliorer la proposition précédente en jouant aussi sur l'épaisseur des branches.

  • documentation
  • un code

On trouvera la doc sur le module turtle ici.


import turtle as tl

 
		
def arbre( hauteur, epaisseur, profondeur, angle  ) :
	if profondeur == 0 : 
		tl.forward(hauteur)
		tl.backward(hauteur)
	else :
		tl.pensize(epaisseur)
		tl.forward(hauteur)
		tl.right(angle)
		arbre(hauteur * 0.6, epaisseur*0.7, profondeur-1,angle)
		tl.left(2*angle)
		arbre(hauteur * 0.6, epaisseur*0.7, profondeur-1,angle)
		tl.right(angle)
		tl.backward(hauteur)

tl.setheading(90) # orientation intiale de la tête : vers le haut
tl.hideturtle() # on cache la tortue
tl.speed(0)	 # on accélère la tortue
tl.color('green')
arbre(  hauteur = 50, epaisseur = 5, profondeur = 7, angle = 30  ) 
tl.exitonclick() # pour  garder ouverte la fenêtre

ramification

Améliorer la proposition précédente en jouant aussi sur le nombre de branches.

  • documentation
  • un code

On trouvera la doc sur le module turtle ici.


import turtle as tl

 
		
def arbre( hauteur, epaisseur, profondeur, angle, embranchement  ) :
	if profondeur == 0 : 
		tl.forward(hauteur)
		tl.backward(hauteur)
	else :
		tl.pensize(epaisseur)
		tl.forward(hauteur)
		tl.right(angle - angle/embranchement)
		for _ in range(embranchement) :
			arbre(hauteur * 0.6, epaisseur*0.75, profondeur-1, angle, embranchement)
			tl.left(2*angle/embranchement)
		tl.right(angle + angle/embranchement)
		tl.backward(hauteur)

tl.setheading(90) # orientation intiale de la tête : vers le haut
tl.hideturtle() # on cache la tortue
tl.speed(0)	 # on accélère la tortue
tl.color('green')
arbre(  hauteur = 100, epaisseur = 5, profondeur = 7, angle = 90, embranchement = 3  ) 
tl.exitonclick() # pour  garder ouverte la fenêtre

un peu de hasard

Améliorer la proposition précédente en introduisant un peu de hasard.

  • documentation
  • un code

On trouvera la doc sur le module turtle ici.

Dans cette solution, on joue sur le hasard du nombre de branches du niveau suivant, du rapport de réduction de la taille et de l'épaisseur des branches.


import turtle as tl
from random import random, randint
 
 
def rapport(a,b) :
	""" float au hasard dans  [a ,a+b["""
	return a * random() + b
	
def branches(n) :
	""" n est un entier.
	tire au hasard un entier entre n-2 et n+2, mais jamais en dessous de l'entier 2"""
	return max(2, randint(n-2,n+2))
		
def arbre( hauteur, epaisseur, profondeur, angle, embranchement  ) :
	if profondeur == 0 : 
		tl.forward(hauteur)
		tl.backward(hauteur)
	else :
		tl.pensize(epaisseur)
		tl.forward(hauteur)
		tl.right(angle - angle/embranchement)
		for _ in range(embranchement) :
			arbre(hauteur * rapport(0.4, 0.3), epaisseur * rapport(0.7,0.1) , profondeur-1, angle, branches(embranchement))
			tl.left(2*angle/embranchement)
		tl.right(angle + angle/embranchement)
		tl.backward(hauteur)

tl.setheading(90) # orientation intiale de la tête : vers le haut
tl.hideturtle() # on cache la tortue
tl.speed(0)	 # on accélère la tortue
tl.color('green')
arbre(  hauteur = 100, epaisseur = 5, profondeur = 5, angle = 90, embranchement = 3  ) 
tl.exitonclick() # pour  garder ouverte la fenêtre