3 votes

Fonction récursive F# dans une étrange boucle sans fin

Je suis très novice en ce qui concerne F#, et j'ai rencontré un petit problème concernant les fonctions récursives que j'espérais pouvoir comprendre.

J'ai une fonction qui est censée produire le prochain nombre pair :

let rec nextEven(x) =
    let y = x + 1
    if y % 2 = 0 then y
    else nextEven y

// This never returns..
nextEven 3;;

J'utilise le mot-clé "rec" pour qu'il soit récursif, bien que lorsque je l'utilise, il tourne en boucle sans fin pour une raison quelconque. Si je réécris la fonction comme suit :

let nextEven(x) =
    let y = x + 1
    if y % 2 = 0 then y
    else nextEven y

Ensuite, tout fonctionne bien (pas de mot-clé récurrent). Pour une raison quelconque, j'ai pensé que j'avais besoin de "rec" puisque la fonction est récursive (alors pourquoi pas ?) et pourquoi la première version de la fonction s'exécute-t-elle à l'infini ?

EDIT
Il s'avère que c'était une erreur de débutant. J'avais créé plusieurs définitions de la fonction en cours de route, comme l'expliquent les commentaires et les réponses.

5voto

Daniel Points 29764

Je soupçonne que vous avez plusieurs définitions de nextEven . C'est la seule explication à la compilation de votre deuxième exemple. Repro :

module A =
  let rec nextEven(x) =
    let y = x + 1
    if y % 2 = 0 then y
    else nextEven y

open A //the function below will not compile without this

let nextEven(x) =
    let y = x + 1
    if y % 2 = 0 then y
    else nextEven y //calling A.nextEven

Essayez de réinitialiser votre session FSI.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X