LA RÉCURSION
"PROGRAMMER DES BOUCLES"
--> STRUCTURE DE CONTRÔLE RÉPÉTITIVE
EN SCHEME, C'EST TRÈS SIMPLE...
... IL N'Y A PAS DE PRIMITIVE
ÉVÉNEMENT MIDI:
FONCTIONS UTILISANT MZSHARE:
(JOUER-POUM D)
(JOUER-TCHI D)
= (JOUER-MIDI (LIST 42 D 250 80 9))
BPM = 120 ("BEATS PER MINUTE")
(DEFINE ( D)
(JOUER-POUM D)
(JOUER-TCHI (+ D 250))
(PAUSE 450)
( (+ D 500)))
--> ON LANCE (BOUCLE (MIDI-GET-TIME))
PROBLÈME: BOUCLE
--> POUR CONTRÔLER L'ARRÊT D'UNE BOUCLE: IL FAUT UN "TEST D'ARRÊT"
(DEFINE ( D N)
(DISPLAY N) (NEWLINE)
(JOUER-POUM D)
(JOUER-TCHI (+ D 250))
(PAUSE 450)
(IF (= N 0) 'STOP ;TEST D'ARRÊT
( (+ D 500) (- N 1))))
--> ON LANCE (BOUCLE1 (MIDI-GET-TIME) 10)
AVEC UNE LISTE D'EVENEMENTS MIDI ?
(JOUER-HOUSE D)
= (JOUER-LISTE-AT D HOUSE)
(DEFINE ( D N)
(DISPLAY N) (NEWLINE)
(JOUER-HOUSE D)
(PAUSE 7900)
(IF (= N 0) 'STOP ;TEST D'ARRÊT
( (+ D 8000) (- N 1))))
--> LA SÉQUENCE "HOUSE" EST RÉPÉTÉE EN BOUCLE
N! = 1 * 2 * 3 * ... * N
DÉFINITION MATHÉMATIQUE PAR RÉCURRENCE :
|
EN SCHEME, CELA S'ÉCRIT :
--> FAIRE UNE "TRACE":
(DEFINE (F N)
(COND ((= N 0) 1)
(ELSE (* N (F (- N 1))))))
"COND" = STRUCTURE DE CONTRÔLE CONDITIONNELLE,
MAIS PAS DE PRIMITIVE SCHEME POUR LA RÉPÉTITION !!!
POURQUOI ÇA MARCHE ???
= DÉTAILLER "À LA MAIN" LE CALCUL
POUR UNE PETITE VALEUR DE DÉPART
(DEFINE ( N)
(COND ((= N 0) 1) ; TEST D'ARRÊT
(ELSE (* N ( (- N 1))))))
UN "APPEL RÉCURSIF":
APPEL DE FONTION À L'INTÉRIEUR DE SA PROPRE DÉFINITION
"DONNÉE MODIFIÉE"
= À L'APPEL RÉCURSIF, N EST REMPLACÉ PAR N-1
|
(DEFINE (U N)
(COND ((= N 0) 1)
((= N 1) 1) ; TESTS D'ARRÊT
(ELSE (+ (U (- N 1)) (U (- N 2))))))
; APPELS RÉCURSIFS ENCAPSULÉS
UNE TRACE:
|
A = BQ +
(DEFINE (PGCD A B)
(COND ((= B 0) A)
(ELSE (PGCD B (REMAINDER A B)))))
UNE TRACE:
PI = 2 * 4 * 4 * 6 * 6 * 8 ...
DÉFINITION MATHÉMATIQUE PAR
RÉCURRENCE ???
|
ÇA MARCHE :
W2 = 2 * W1 = 2
W3 = 4 * W2 = 2 * 4
W4 = 4 * W3 = 2 * 4 * 4
ETC...