Skip to content
Snippets Groups Projects
Commit 65893bd3 authored by Mathieu Schiess (EDU-GE)'s avatar Mathieu Schiess (EDU-GE)
Browse files

ajout du notebook sur la recursivite

parent d6a3ddc6
Branches
No related tags found
No related merge requests found
%% Cell type:markdown id: tags:
<h1 class="alert alert-success">Récursivité - partie 2</h2>
%% Cell type:markdown id: tags:
<h2 class="alert alert-info">1. Rappels sur Turtle</h2>
Turtle est un module Python permettant de dessiner sur un canevas. Le crayon est dirigé par une tortue !
Jupyter propose une implémentation de ce module (très légèrement modifié). Les commandes principales consistent à positionner la tortue, lever ou baisser le crayon (pour écrire ou non lorsque la tortue se déplace) et à commander les mouvements de la tortue (avancer/reculer, tourner à gauche/droite d'un certain angle).
Pour mieux comprendre et découvrir les commandes accessibles, étudier l'exemple de démonstration ci-dessous :
%% Cell type:code id: tags:
``` python
import turtle as tt # import du module turtle dans Basthon
tt.speed(3) # vitesse moyenne (maxi = 10)
tt.penup() # lève le crayon (pour ne pas écrire pendant le déplacement)
tt.setposition(-100, 100)
# origine (0, 0) au centre du cadre de dessin (dimensions 600x600)
tt.pendown() # abaisse le crayon (pour voir la trace de la tortue)
tt.forward(20) # avance de 20
tt.left(60) # virage de 60° vers la gauche
tt.forward(100)
tt.right(120) # virage de 120° vers la droite
tt.pencolor("red") # couleurs autorisées "blue", "yellow", "brown", "black", "purple", "green"
tt.forward(100)
tt.left(60)
tt.forward(100) # recule de 100
tt.backward(70)
tt.right(90)
tt.pencolor("green")
tt.forward(300)
tt.penup()
tt.home() # retour à l'origine
tt.done() # indispensable pour activer la tortue dans Basthon
```
%% Output
%% Cell type:code id: tags:
``` python
# 2ème exemple :
import turtle as tt # import du module turtle dans Basthon
couleurs = ["red", "blue", "yellow", "brown", "black", "purple", "green"]
tt.speed(10)
for i in range(7):
tt.penup()
tt.setposition(-200+50*i, 0)
tt.pendown()
tt.pencolor(couleurs[i])
for j in range(4):
tt.forward(30)
tt.left(90)
tt.done()
```
%% Output
%% Cell type:markdown id: tags:
<h2 class="alert alert-info">2. Fractales : courbe de Koch</h2>
La courbe de Koch est une fractale reposant sur la construction récursive suviante :
1. Étape 1 : Tracer un segment de longueur a.
![Image de losange](https://githepia.hesge.ch/info_sismondi/3AM.OS/-/raw/main/recursivite/koch_0.png)
2. Étape 2 : Diviser le segment en 3 parties de même longueur. Construire un triangle équilatéral ayant pour base le segment médian de la première étape, et en supprimer la base.
![Image de losange](https://githepia.hesge.ch/info_sismondi/3AM.OS/-/raw/main/recursivite/koch_1.png)
3. Étape 3 : Reprendre l'étape 2 sur chacun des segments créés.
![Image de losange](https://githepia.hesge.ch/info_sismondi/3AM.OS/-/raw/main/recursivite/koch_2.png)
4. Et ainsi de suite...
![Image de losange](https://githepia.hesge.ch/info_sismondi/3AM.OS/-/raw/main/recursivite/koch_3.png)
%% Cell type:markdown id: tags:
On peut construire récursivement cette courbe.
La fonction de tracer prend deux paramètres en entrée :
* la longeur $a$ du segment.
* l'étape $n$ de "profondeur" de récursivité.
Par exemple, à la profondeur $n=0$, on trace un simple segment : ceci constituera la condition d'arrêt des appels récursifs. À la profondeur $n=1$, le tracé donne la figure de l'étape 2.
%% Cell type:markdown id: tags:
<h2 class="alert alert-warning">ex 1 : Dessiner avec la tortue (pas de récursivité ici) la figure correspondant à l'étape 2 (décrite ci-avant).</h2>
Écrire une fonction etape2(a) pour réaliser cette tache.
%% Cell type:code id: tags:
``` python
tt.speed(10)
def etape2(a):
# VOTRE CODE CI-DESSOUS
#...
# test:
a = 50
etape2(a)
tt.done()
```
%% Cell type:markdown id: tags:
<h2 class="alert alert-warning">ex 2 : Courbe de Koch : fonction récursive.</h2>
En vous inspirant de la logique du code de la fonction précédente (en la "rendant récursive"), écrire une fonction koch(a, n) récursive qui :
- prend comme paramètres un nombre entier a représentant la longueur du segment et un entier n égal au nombre de récursions souhaité.
- construit la courbe de Koch en divisant récursivement chacun des segments
*Rappel* : si n=0, le tracé est un simplement segment de longueur a.
%% Cell type:code id: tags:
``` python
tt.speed(10)
tt.penup()
tt.setposition(-300, 0)
tt.pendown()
def koch(a, n):
# VOTRE CODE CI-DESSOUS
#...
koch(360, 3)
tt.done()
```
%% Cell type:markdown id: tags:
<h2 class="alert alert-info">Et pour s'amuser encore un peu...</h2>
Exécuter le code ci-dessous :
%% Cell type:code id: tags:
``` python
a = 180
tt.speed(10)
tt.penup()
tt.setposition(-a/2, a/3)
tt.pendown()
def koch(a, n):
if n == 0:
tt.forward(a)
else:
koch(a/3, n-1)
tt.left(60)
koch(a/3, n-1)
tt.right(120)
koch(a/3, n-1)
tt.left(60)
koch(a/3, n-1)
def flocon(a, n):
for i in range(3):
koch(a, n)
tt.right(120)
flocon(a, 3)
tt.penup()
tt.home()
tt.done()
```
%% Cell type:code id: tags:
``` python
```
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment