Récursivité dans N

06/02/2024

Pour comprendre la récursivité, il faut comprendre la récursivité.

Rappels

  • Fonction fact démo live.
  • 
    	  let rec fact (n:int):int = match n with
    	  |0 -> 1
    	  |_ -> n*(fact (n-1))
    	  ;;
          
  • Représentation des entiers de Peano: nat_peano={O}{S(n)|nnat_peano}
  • 
    	  type nat_peano = O | S of nat_peano;;
          

On distinguera deux concept clés dans la réalisation d'une fonction:

  • La Spécification
    • Abstrait
    • Précis
    • Proche d'une description mathématique
    • Contient des exemples représentatifs
  • La Réalisation
    • Algorithme en Français
    • Algorithme en OCaml
Fonction int_v_nat_peano
  • Spécification
    • profil: Nnat_peano
    • sémantique: int_v_int_peano(n) est le naturel de Peano correspondant à l'entier n.
    • exemples:
      • int_v_int_peano(0)=O
      • int_v_int_peano(4)=S(S(S(S O)))
  • Réalisation
    • équation de récurrence:
      • int_v_int_peano(0)=O
      • int_v_int_peano(p+1)=S(int_v_int_peano(p))
    • implémentation: démo live.
  • Terminaison
    Montrer que pour tout n dans N la fonction int_v_nat_peano termine.
    démo live.
Addition dans nat_peano
  • Spécification add
    • profil: nat_peanonat_peanonat_peano
    • sémantique: add n1 n2 est le naturel de Peano correspondant à la somme des entiers n1 et n2.
    • exemples:
      • add O O=O
      • x,add x O = x
      • add S(O) S(O) = S (S O))
  • Réalisation
    • équation de récurrence ?

		add O O = O
		add S(x) O = S(x)
		add O S(y) = S(y)
		add x S(y) = S(add x y)
		add x S(y) = add S(x) y)
		add S(x) y = S(add x y)
		add S(x) y = add x S(y)
		add S(x) S(y) = S(S(add x y))
	    

		add O O = O
		add S(x) O = S(x)
		add O S(y) = S(y)
		add x S(y) = S(add x y)
		add x S(y) = add S(x) y)
		add S(x) y = S(add x y)
		add S(x) y = add x S(y)
		add S(x) S(y) = S(S(add x y))
	    

		add O O = O
		add S(x) O = S(x)
		add O S(y) = S(y)
		add x S(y) = S(add x y)
		add x S(y) = add S(x) y)
		add S(x) y = S(add x y)
		add S(x) y = add x S(y)
		add S(x) S(y) = S(S(add x y))
	    

		add O O = O
		add S(x) O = S(x)
		add O S(y) = S(y)
		add x S(y) = S(add x y)
		add x S(y) = add S(x) y)
		add S(x) y = S(add x y)
		add S(x) y = add x S(y)
		add S(x) S(y) = S(S(add x y))
	    

		add O O = O
		add S(x) O = S(x)
		add O S(y) = S(y)
		add x S(y) = S(add x y)
		add x S(y) = add S(x) y)
		add S(x) y = S(add x y)
		add S(x) y = add x S(y)
		add S(x) S(y) = S(S(add x y))
	    
  • Implémentation: démo live.
La fonction puissance
  • Spécification
    • profil: puissance:RNR ou floatintfloat
    • sémantique: Élève un réel à la puissance n
    • exemples:
      • puissance(x,0)=1
      • puissance(2,2)=4
      • puissance(1,3)=1
  • La Réalisation
    • puissance(x,0)=1
    • puissance(x,n)=x×puissance(x,n1)
    • Implémentation: démo live.
  • Terminaison: démo live.
  • Complexité: Combien d'appel à la fonction ?

Possible de faire mieux ?

  • x2n=xn×xn
  • x2n+1=xn×xn×x
  • Implémentation: démo live.
  • Complexité: logn
Fonction mult
  • profil: NN
  • sémantique: mult x y = x*y
  • exemple: mult x 0 = 0
  • équations récursives:
    • mult 0 0 = 0
    • mult 0 p = 0
    • mult q 0 = 0
    • mult p q = (mult (p-1) (q-1)) + p + q - 1
  • Implémentation: démo live.
  • Terminaison: mesure p q = min(p,q)

Conclusion

On suit toujours à peu près le même modèle

  • Spécification: profil, sémantique, exemples.
  • Réalisation: équations récursives, implémentation.
    • f(0)=...
    • f(p+1)=...f(p)...
  • Terminaison: mesure =
    • même arguments que ceux de la fonction
    • mesure N
    • décroit strictement à chaque appel récursif (équations récursives)

Attention aux fonctions "hors modèle"

  • Quotient de la division
  • puiss2

À suivre:

  • Fonctions mutuellement récursives
  • Listes
Slides disponibles sur pierre.wulles.org:

Ce cours est sous licence Creative Commons CC BY-SA 4.0 Vous êtes libre de le réutiliser pour votre usage personnel.