La suite des valeurs b,b−a,b−2×a, etc. est strictement décroissante, car aest strictement positif, et
on finit toujours pas aboutir à un couple d’arguments (a,b)tel que b−aest négatif. Ce cas est défini
explicitement.
Cette méthode ne permet pas de traiter tous les cas :
SYRACUSE(n)
Si n=0 ou n=1alors 1
sinon si nmod 2 =0alors SYRACUSE (n/2)
sinon SYRACUSE (3×n+1)
Problème ouvert : l’algorithme est bien défini et vaut 1 sur N.
Question : N’y a-t-il vraiment aucun moyen de déterminer automatiquement si un algorithme récursif quelconque
va terminer?
1.3 Non décidabilité de la terminaison
Question : peut-on écrire un programme qui vérifie automatiquement si un programme donné Ptermine quand
il est exécuté sur un jeu de données D?
Entrée Un programme Pet un jeu de données D.
Sortie vrai si le programme Ptermine sur le jeu de données D, et faux sinon.
1.3.1 Démonstration de la non décidabilité
Supposons qu’il existe un tel programme, nommé termine, de vérification de la terminaison. À partir de ce
programme on conçoit le programme Qsuivant :
programme Q
résultat = termine(Q,/
0)
tant que résultat = vrai faire attendre une seconde fin tant que
renvoyer résultat
Supposons que le programme Q—qui ne prend pas d’arguments— termine. Donc termine(Q,/
0) renvoie vrai,
la deuxième instruction de Qboucle indéfiniment et Qne termine pas. Il y a donc contradiction et le programme Q
ne termine pas. Donc, termine(Q,/
0) renvoie faux, la deuxième instruction de Qne boucle pas, et le programme Q
termine normalement. Il y a une nouvelle fois contradiction : par conséquent, il n’existe pas de programme tel que
termine, c’est-à-dire qui vérifie qu’un programme termine ou non sur un jeu de données...
Le problème de la terminaison est indécidable!
1.4 Importance de l’ordre des appels récursifs
Fonction qui affiche les entiers par ordre décroissant, de njusqu’à 1 :
DÉCROISSANT(n)
Si n=0alors ne rien faire
sinon afficher n
DÉCROISSANT(n−1)
Exécution pour n=2 :
Appel de DÉCROISSANT(2)
Affichage de 2.
Appel de DÉCROISSANT(1)
Affichage de 1.
Appel de DÉCROISSANT(0)
L’algorithme ne fait rien.
Résultat affichage d’abord de 2 puis de 1 : l’affichage a lieu dans l’ordre décroissant.
Intervertissons maintenant l’ordre de l’affichage et de l’appel récursif :
3