Favicon
NSI Terminale

Correction : langages fonctionnels - OCaml

Syntaxe de base

Périmètre


let pi = 4.*.atan 1.;;

2.*.pi*.0.12;;
			

Surface


let pi = 4.*.atan 1.;;

pi*.0.12**2.;;
			

Attention, les puissances ne sont définies que pour les nombres flottants en OCaml.

Fonctions

Périmètre


let pi = 4.*.atan 1.

let perimetre r =
    2.*.pi*.r;;

print_float (perimetre 5.);;
			

Les parenthèses permettent de manière générale de regrouper des éléments dans une même expression; sans ces parenthèses, on passerait à la fonction print_float deux arguments ( perimetre et 5.), ce qu'elle ne prévoit pas !

Surface


let pi = 4.*.atan 1.

let surface r =
    pi*.r*.r;;
    
print_float (surface 5.);;
		

Volume


let volume a b c =
    a*.b*.c;;
    
print_float (volume 5. 5. 5.);;
		

Moyenne


let moyenne a b c =
    (a+.b+.c)/.3.;;
    
print_float (moyenne 10. 12. 8.);;
		

Fonctions récursives

Somme des n premiers entiers


let rec somme n =
    if n = 0
    then 0
    else n + somme(n-1);;
    
print_int (somme 10);;
		

Nombres de Fibonacci


let rec fibo n =
    if n = 0
    then 0
    else if n = 1
    then 1
    else fibo(n-1)+fibo(n-2);;
    
print_int (fibo 10);;
		

Exercices

Valeur absolue


let abs n = 
    if n > 0
    then n
    else -n;;

print_int (abs 10);
print_newline ();
print_int (abs (-10));;  
		

Pour indiquer un nombre négatif, il faut l'entourer par des parenthèses.
En effet, une expression comme : abs -10 serait interprétée comme une soustraction...

Fraction maximale


let max a b c d = 
    let x1 = a/.b in
    let x2 = c/.d in
    if x1 > x2
    then x1
    else x2;;
    
print_float (max 12. 4. 27. 4.);;
		

Racines polynome du second degré


let racine a b c = 
    let delta = b**2.-.4.*.a*.c in
    if delta < 0.
    then 0., 0.
    else if delta = 0.
    then (-.b)/.(2.*.a), 0.
    else ((-.b)+.sqrt delta)/.(2.*.a), ((-.b)-.sqrt delta)/.(2.*.a);;
				
racine 1. 0. (-.1.);;			
		

Les résultats renvoyés doivent être tous du même type, ici, un tuple de deux éléments.