Algorithmes fonctionnels en javascript sous la forme de cours et d'exercices. Utilisation de js dans un contexte de liste, de map, list_it. Inspiré de caml. A lire à l'envers...

mercredi 3 septembre 2008

Des exercices !

Le mieux pour apprendre les particularités d'un langage c'est de s'exercer, voici quelques exercices d'algorithmique qui permettront de se familiariser avec la programmation fonctionnelle et récursive en javascript.

Calculer de la dérivée d'une fonction f en un point x à l'aide de l'approximation dx.
On pourra écrire: dérivée( f, x, dx).
var dérivée= function(f,x,dx){
return (f(x+dx)-f(x))/dx ;

var carré = function(x){ return x*x ;}
dérivée(carré,30,0.0000001); ///f'(x^2)=2x (réponse 60)


Version 2 : renvoyer la fonction dérivée :

var dérivée =function(f,dx){
return function(x){ (f(x+dx)-f(x))/dx} ;
}

Avez vous remarqué qu'ici on renvoi non pas un nombre mais une fonction ?,

dérivée(carré, 0.001)(3);

Ou encore :

var dérivée = function(dx){
return function(f){
return function(x){
return (f(x+dx)-f(x))/dx} ;
}
}
// n'oubliez pas les return !!

Dans cette dernière version on peut parler de "curryfication", terme utilisé en hommage à Haskell Curry précurseur avec Alonzon Church du lambda calcul, et qui avait montré cette possibilité , l'opérateur () ne se prête pas tellement à une curryfication systématique des fonctions comme en Caml mais il est souvent intéressant cependant de renvoyer une fonction en résultat.

On peut ainsi écrire:

var fprime = function(f){ return dérivée(0.001)(f) ; }
var sinprime = fprime(Math.sin) ;
var cosprime = fprime(Math.cos) ;
var carreprime = fprime(function(x){return x*x;}) ;

Pour être utilisé ultérieurement :

sinprime(Math.PI) ;// 0.99



Récursion :

La récursion est très peu utilisée par les programmeurs java ou C, souvent à raison car ces programmes sont fondamentalement procéduraux. Par contre le javascript se prête très bien à la programmation récursive, et la récursion permet de traiter des problèmes avec souvent beaucoup plus de facilité que le traitement procédural, il faudra par contre faire attention à ne pas compromettre la puissance de la machine par des récursions imbriquées.

On s'échauffe avec ce petit problème :
Créer une fonction récursive qui calcule le nombre de chiffres d'un entier :

function nchiffres(n) { 
return n<10&&1 || 1+ nchiffres( Math.floor(n/10) ) ;
}


Remarquez la syntaxe qui permet de s'affranchir du if/else et qui n'est à pas nécessairement à considérer comme un exemple de programmation à suivre!

Aucun commentaire: