0 + X = X
LES OPÉRATIONS NE PEUVENT S'EFFECTUER QUE QUAND ELLES ONT LA VALEUR DE LEURS 2 ARG.
--> ELLES SONT MISES EN ATTENTE DANS UNE PILE (STACK)
--> AUCUNE OPÉRATION N'EST MISE EN ATTENTE
POUR VÉRIFIER QU'UNE FONCTION EST RÉCURSIVE TERMINALE:
--> NON TERMINAL
SINON
--> TERMINAL
COMMENT ÉCRIRE DES RÉCURSIONS TERMINALES ????
(DEFINE (FONCTION1 N)
(DISPLAY N)
(DISPLAY " ")
(+ 0 (FONCTION1 (+ N 1))))
(DEFINE (FONCTION2 N)
(DISPLAY N)
(DISPLAY " ")
(FONCTION2 (+ N 1)))
APPEL RÉCURSIF SANS TEST D'ARRÊT
==> BOUCLE INFINIE
FONCTIONS NE SONT PAS TRÈS
DIFFÉRENTES:
COMPORTEMENTS SONT RADICALEMENT
DIFFÉRENTS !!!!!
(= TERMINE NORMALEMENT)
(= BLOQUÉE PAR "OUT OF MEMORY")
POUR DES RÉCURSIONS AVEC PLUSIEURS MILLIERS D'ÉTAPES ( > 157.000), IL EST INDISPENSABLE D'ÉCRIRE DES RÉCURSIONS TERMINALES
CRITÈRE:
TECHNIQUE:
|
POUR ÉVITER QUE DES OPÉRATIONS RESTENT EN ATTENTE DEVANT L'APPEL RÉCURSIF, --> IL FAUT METTRE CES OPÉRATIONS A L'INTÉRIEUR DE L'APPEL RÉCURSIF . . . |
|
. . . SUR UNE VARIABLE !!! |
(FACT-TERMINALE N 1)
ATTENTION:
(DEFINE (FACT N)
(COND ((= N 0) 1)
(ELSE (* N (FACT (- N 1))))))
; --> CALCUL EN ATTENTE
VERSION TERMINALE:
(DEFINE (FACT-TERMINALE N X)
(COND ((= N 0) X)
(ELSE (FACT-TERMINALE (- N 1) (* N X)))))
; --> CALCUL SUR VARIABLE X
LANCEMENT:
--> INITIALISATION X=1
TEST D'ARRET DANS UNE RÉCURSION TERMINALE
--> DONNER LA VARIABLE QUI CONTIENT LE RÉSULTAT DU CALCUL
(DEFINE (FACT N)
(DEFINE (FACT-TERMINALE N X)
(COND ((= N 0) X)
(ELSE (FACT-TERMINALE (- N 1) (* N X)))))
|
X : VARIABLE DE CALCUL
--> LE DEFINE AUXILIAIRE (SOUS-PROGRAMME) INTRODUIT DES VARIABLES CACHÉES DANS LA FONCTION PRINCIPALE
N : COMPTEUR DÉCROISSANT
--> ON PEUT UTILISER UN COMPTEUR CROISSANT
(DEFINE (FACT N)
(DEFINE (AUX K X)
(COND ((> K N) X)
(ELSE (AUX (+ K 1) (* K X)))))
|
(IOTA 5)
--> (5 4 3 2 1)
(DEFINE (IOTA N)
(COND ((= N 0) ())
(ELSE (CONS N (IOTA (- N 1))))))
(DEFINE (FACT N)
(COND ((= N 0) 1)
(ELSE (* N (FACT (- N 1))))))
(DEFINE (IOTA N)
(DEFINE (AUX N RES)
(COND ((= N 0) RES) ;RESULTAT DU CALCUL
(ELSE (AUX (- N 1) (CONS N RES)))))
(AUX N ()))
--> LA LISTE APPARAIT SOUS FORME INVERSÉE !!!
POUR FABRIQUER (5 4 3 2 1) :