2016-12-13 3 views
3

J'ai implémenté mon code qui consiste essentiellement à calculer le reste en deux nombres sans utiliser l'opérateur de module mais je suis coincé dans une situation qui est juste trépidante. Je connais la logique mais je suis novice en f # et je ne sais pas comment l'implémenter.Calculer le reste sans utiliser l'opérateur de module F #

let rec modulus a b = 
if b = 0 Console.WriteLine("Sorry Wrong Divisor") 
let bool neg = a < 0 
a = abs a 
b = abs b 
modulus(val-divisor,divisor) 

Tout ce que je sais est que je reçois une erreur assez basique ici, toute aide,

+0

Le code comme écrit est difficile à comprendre. L'indentation est incorrecte et je soupçonne que l'opérateur égal est mal utilisé –

+0

En plus de ce que Tomas Petricek a indiqué, vous créez une valeur appelée 'neg' (et vous n'avez pas besoin de dire' let bool'): 'let neg = a < 0' est suffisant). Mais vous n'utilisez jamais cette valeur. Vous avez probablement l'intention d'avoir une déclaration 'if' quelque part. Et les instructions 'if' dans F # sont écrites' if (condition) alors (valeur-if-true) else (valeur-if-false) '. Le 'else' est UNIQUEMENT facultatif si le' valeur-if-true »se résout au type' unit'. Si vous ne comprenez pas ce que cela signifie, ne vous en faites pas, rappelez-vous que la partie else d'une instruction if n'est presque jamais optionnelle. – rmunn

Répondre

9

La première étape vers l'obtention de ce au travail est de fixer votre empreinte et transformer votre croquis en code valide F # qui fait compile et s'exécute - cela devrait vous aider à passer à l'étape suivante, qui consiste à corriger la logique de l'implémentation.

Un code minimal qui est semblable à la vôtre et fonctionne en réalité ressemble à ceci:

let rec modulus value divisor : int = 
    printfn "value=%d, divisor=%d" value divisor 
    if divisor = 0 then Console.WriteLine("Sorry Wrong Divisor") 
    let neg = value < 0 
    let value = abs value 
    let divisor = abs divisor 
    modulus (value-divisor) divisor 

modulus 10 5 
  • je fixe l'indentation - F # est indentation sensible, cette question est importante.
  • Je remplacé votre a = abs a avec let - le mot-clé let définit une nouvelle variable, cachant l'existant (comme vous ne pouvez pas muter les variables existantes - ils sont immuables en fa #)
  • Je rebaptisés vos variables à utiliser de manière cohérente divisor et value noms
  • j'ajouté printfn afin que vous puissiez voir comment la fonction fonctionne (il entrera dans une boucle infinie, car elle vérifie actuellement jamais pour la condition de la fin!)
  • je devais ajouter une annotation de type : int dire que le résultat sera int - comme votre fonction ne retourne jamais, cela est nécessaire (mais vous pouvez le supprimer une fois que vous résoudre ce)
+0

Merci beaucoup Tout est clair maintenant. Oui indentation est si sensible dans F # car il n'y a pas d'accolades impliqués. –

0

Vous pouvez calculer le module de manière plus simple

let modulus a b= 
    if b = 0.0 then failwith "Cannot divide by zero" 
    a - b * truncate(a/b); 
+0

Mon exigence était d'utiliser une fonction récursive mais merci –

+0

Mauvais codage. Vous ne pouvez généralement pas comparer de façon fiable les nombres à virgule flottante avec l'opérateur d'égalité. –