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) |
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 e2
se lit: « valeur de l'expression e2, mais avec tous lesx
remplacés par l'expressione1
». - Il n'y a pas de
return
car tout est expression. Par exemple, leif c then e1 else e2
est une expression (exactement équivalente àc?e1:e2
en C oue1 if c else e2
en Python. - Une expression a un et un seul type: par exemple, dans
if c then e1 else e2
, lese1
ete2
ne 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:
low
ethigh
avant la définition de la fonction récursive interne.seq
etx
à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
compare
qui renvoie0
,1
ou-1
:Comme tu vois, les différences d'implantation entre Ocaml et Python sont ici purement syntaxiques. On est vraiment dans un style fonctionnel.