|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||
|
Membre chevronné
![]() Inscription : mars 2010 Messages : 281 ![]() |
Suite à un n-ième message sur la fonction de Fibonacci, je voulais vous faire part de mon profond désaccord vis à vis de l'utilisation quasi systématique de cette fonction comme exemple de programmation fonctionnelle:
Dans quasiment tous les cours d'introduction à la programmation fonctionnelle, que ce soit dans le milieu scolaire (fac ou prépas), dans les bouquins, sur internet, etc, on retrouve systématiquement l'exemple de la fonction de Fibonacci: oh, regardez comme il est simple d'implémenter en fonctionnel la fonction de Fibonacci, alors qu'en impératif, bouh c'est difficile". Je pense que cet exemple est l'un des pire que l'on pourrait imaginer ! Alors oui, la définition en Caml de Fibonacci colle au plus près à la définition mathématique de la suite, alors qu'une version plus impérative s'en éloigne forcément plus. Le seul problème, c'est que cette jolie implémentation a une complexité spaciale linéaire (taille max de la pile) et temporelle exponentielle, alors que la version "naturelle" (programmation dynamique) en impératif a une complexité spatiale et temporelle linéaire, qu'on passe à une complexité spatiale constante trivialement en réalisant qu'on n'a besoin uniquement des deux derniers, et pire que tout, en réfléchissant un peu, on arrive à une complexité temporelle logarithmique ! Pourquoi continue-t-on à montrer comme "hello world" de la programmation fonctionnelle un programme qui pour n'importe quelle entrée non ridicule prend l'age de l'univers à s'exécuter alors qu'il existe une solution en temps pseudo constant ? Alors je ne suis pas contre l'étude de cette fonction: c'est bien sûr très intéressant de voir qu'une implémentation naïve peut être écrabouillée par un peu de réflexion. Mais pas comme espèce de "killer example" ! On pourrait quand même imaginer plein d'autre exemples. En un peu "difficile", parce qu'il faut introduire directement un type, on pourrait imaginer la hauteur d'un arbre Code :
Mais si on veut vraiment écrire des fonctions purement numériques, on peut trouver autre chose. Pourquoi par Syracuse par exemple? Code :
Il y a sans doute plein d'autres idées possibles. Mais je pense qu'il sera difficile de trouver pire que Fibonacci. Donc s'il vous plait, arrêtez d'utiliser Fibonacci comme exemple introductif à la programmation fonctionnelle !! |
||||
|
|
20
|
|
|
#2 |
![]() ![]() ![]() Nicolas ValléeIngénieur d'études Inscription : décembre 2005 Messages : 9 966 ![]() |
la plupart du temps, à moins d'une récurrence forte au sens propre du terme, les structures trop linéaires sont aussi faciles à implanter en impératif qu'en fonctionnel... (et oui, même sur les listes chaïnées, on fait parfois aussi bien en impératif... mais on manipule explicitement ce que le compilo fonctionnel aurait fait)
les structures N-aire (N>=2) sont souvent bien plus parlantes en fonctionnel... même si à partir d'un certain niveau, il faut bien se dire qu'on est capable de modéliser des structures additionnelles adhoc pour accélérer le traitement et la modularité même en impératif (mais ça sort du scope débutant )
|
|
|
00
|
|
|
#3 |
|
Membre Expert
![]() Inscription : avril 2007 Messages : 829 ![]() |
Moi j'aime bien proposer fibonacci en TD de Caml pour une prépa scientifique (MPSI) : on peut écrire la version naïve, une version efficace (`fibo un2 un1 k` prend le `n-2 `et `n-1`-ième éléments et `k`, et renvoie le `n+k-2`-ième élément), une version par exponentiation rapide de matrices 2x2, et après on leur demande d'écrire la formule close en puissance du nombre d'or et ils se souviennent toute leur vie que "quand j'ai une erreur avec des flottants¹, c'est sans doute qu'il manque un point quelque part".
Un autre détail amusant est le calcul précis de la complexité de la version naïve : combien d'appels récursifs à "fibo" `fibo n` va-t-il effectuer ? Mais oui, proposer fibonacci "comme ça" ou à des gens qui n'ont pas la formation mathématique qui suit derrière ne sert à rien. Je pense que si on veut le faire, il faut essayer de le faire dans le détail et s'assurer que les gens ont compris l'intérêt, et pas comme un exemple fourni sans explication. ¹: les nombres flottants sont généralement une nuisance, pas seulement en Caml d'ailleurs; ils sont cependant utiles car ils permettent de faire des TDs sur le fractales de Mandelbrot ou Julia, qui passent très bien avec le module Graphics et qui sont toujours un gros, gros succès auprès des élèves. |
|
|
10
|
|
|
#4 |
|
Membre chevronné
![]() Inscription : mars 2010 Messages : 281 ![]() |
Je précise que ce n'était pas un troll "pourquoi le fonctionnel roxx grave par rapport à l'impératif"
Et oui, il faut présenter fibo à un moment, parce que c'est une source de questions et d'exemples intéressants. Mais juste pas comme premier exemple |
|
|
00
|
|
|
#5 |
|
Membre confirmé
![]() Ingénieur développement logiciels Inscription : mai 2009 Messages : 89 ![]() |
J'essaye en ce moment d'initier à la programmation fonctionnelle en Haskell via la construction d'un parser monadique simple (aucune utilisation du Module Parsec d'Haskell, tout est fait "maison"). Bien sur, je pense bien à ne pas prononcer les mots monad, functor, adt,... même s'ils sont intensivement utilisés dans l'exercice (j'ai toujours eu des regards étranges quand je parle de monads, je sais pas pour vous
Que pensez-vous de cet exercice ? |
|
00
|
|
|
#6 | ||
|
Membre Expert
![]() Inscription : avril 2007 Messages : 829 ![]() |
Citation:
Citation:
Après c'est peut-être un point de détail; ça n'empêche pas de vendre du rêve aux débutants en leur montrant comment les fonctions c'est rigolo. Mais j'aurais quand même une préférence pour le choix d'un exemple plus simple où on peut raisonnablement montrer ces deux approches et les comparer. |
||
|
|
00
|
|
|
#7 | ||
|
Membre confirmé
![]() Ingénieur développement logiciels Inscription : mai 2009 Messages : 89 ![]() |
Citation:
Citation:
Mon but final est surtout de désacraliser les monades où tout autre concept au nom exotique car je suis persuadé qu'ils constituent le principal frein à l'entrée dans le monde de la FP. Aurais-tu des exemples d'approche plus intéressantes à enseigner ? |
||
|
00
|
|
|
#8 |
|
Membre Expert
![]() Inscription : avril 2007 Messages : 829 ![]() |
Attention, il ne faut pas prendre mon post comme une critique négative de ton exemple. Je ne dis pas qu'il est plus mauvais qu'un autre, je mentionne juste des défauts; il n'y a pas d'exemple parfait de toute façon.
Pour l'introduction aux monades, j'aime bien utiliser les exemples de Wadler dans Monads for functional programming (PDF) : un petit évaluateur arithmétique simple, avec une monade Maybe, une monade State et une monade Writer (en fait c'est un peu abusif, la deuxième est aussi une monade Writer déguisée) appliquées au même exemple. Ceci dit, je ne considère pas pour ma part qu'une introduction à la programmation fonctionnelle doive nécessairement inclure une introduction aux monades. C'est un concept relativement abstrait qui peut poser des difficultés de compréhensions. Venant d'un milieu Caml plutôt qu'Haskell je ne l'ai jamais vu enseigner comme notion de base, et je ne suis pas convaincu que ce soit désirable. Bien sûr, tout dépend du public cible et de ce qu'il sait en arrivant. |
|
|
00
|
|
|
#9 |
|
Membre confirmé
![]() Ingénieur développement logiciels Inscription : mai 2009 Messages : 89 ![]() |
Je ne l'ai pas mal pris
Je cherche avant tout à améliorer mon contenu donc toute remarque constructive est bonne à prendre Merci pour ton lien. Je suis d'accord avec toi pour les monades mais je voulais les faire manipuler le concept sans le montrer explicitement du doigt. Je pense que cette démarche peut être intéressante car lorsque l'on voit que pleins de développeurs utilisent les instruction try / catch dans des langages impératifs sans se douter une seconde qu'il s'agit d'une monade, on se dit qu'il peut être bon de cacher des choses au début
|
|
10
|
|
|
#10 | ||||
![]() ![]() Damien GuichardInscription : juin 2007 Messages : 1 513 ![]() |
Le mauvais tutoriel OCaml
Code OCaml :
oh, regardez comme il est simple d'implémenter en fonctionnel la fonction de Fibonacci, alors qu'en impératif, c'est difficileLe bon tutoriel Coq Code Coq :
oh, regardez comme il est simple d'implémenter l'arbre de Fibonacci avec un type dépendant, alors qu'avec un type algébrique, c'est difficile
__________________
Du même auteur: le cours OCaml, le dernier article publié, le projet, le blog dvp et le jeu vidéo. Avant de poser une question je lis les règles du forum. |
||||
|
00
|
Copyright © 2000-2013 - www.developpez.com