Last active
August 29, 2015 14:17
-
-
Save fabian57/fafdf1b4668d25edebaf to your computer and use it in GitHub Desktop.
On dirait que ça marche avec les tests
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| def binary_search(seq, x): | |
| def recurs(low, high): | |
| if low <= high: | |
| mid = low + (high - low) / 2 | |
| if x < seq[mid]: | |
| return recurs(low, mid-1) | |
| elif x > seq[mid]: | |
| return recurs(mid+1, high) | |
| else: | |
| return mid | |
| return recurs(0, len(seq) - 1) |
Author
Eh bien merci beaucoup
Et je ne comprends pas grand chose à Ocaml... j'ai un ami en prépa qui m'a montré très rapidement et je comprends vraiment que les trucs de base....
Ok pour la révision, selon moi c'est parfait.
Les deux programmes sont très similaires, ça devrait t'aider à comprendre.
- La construction
let x = e1 in e2se lit: « valeur de l'expression e2, mais avec tous lesxremplacés par l'expressione1». - Il n'y a pas de
returncar tout est expression. Par exemple, leif c then e1 else e2est une expression (exactement équivalente àc?e1:e2en C oue1 if c else e2en Python. - Une expression a un et un seul type: par exemple, dans
if c then e1 else e2, lese1ete2ne peuvent pas être de type différent. Ça pose un problème pour cette fonction qui doit renvoyer soit un entier (indice), soit rien du tout si l'élément n'existe pas. On contourne le problème en étendant le type entier d'une valeur supplémentaire qui signifie: « absence de valeur ». C'est un typeoption. Ici, un entier « optionnel » est soit un certain entierx(Some x), soit rien du tout (None).
Mais je suis d'accord que le paradigme fonctionnel est difficile à comprendre à partir du moment où l'on a été « formaté » avec de l'impératif. C'était mon cas, et j'ai dû oublier et réapprendre OCaml plusieurs fois avant de l'intégrer complètement.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Super, comme d'habitude 😃
S'il faut trouver quelque chose à redire:
lowethighavant la définition de la fonction récursive interne.seqetxàrecurs, leur valeur est constante à l'intérieur de la fonctionbinary_search.(De mon côté, ça me fait prendre conscience que je dois uniformiser mes notations par rapport à la version impérative qu'on avait faite il y a quelques semaines.)
Dans mon cours de programmation fonctionnelle en DUT 2, je fais implanter cet algorithme en Ocaml, et ça donne ça:
Ou, plus brièvement, avec une fonction
comparequi renvoie0,1ou-1:Comme tu vois, les différences d'implantation entre Ocaml et Python sont ici purement syntaxiques. On est vraiment dans un style fonctionnel.