不使用模数运算符计算余数 F#

Computing remainder without using modulus operator F#

我已经实现了我的代码,它基本上是在不使用模数运算符的情况下计算两个数字的余数,但是,我陷入了一种非常忙碌的情况。我知道逻辑但是我是 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)

我所知道的是我在这里犯了一个非常基本的错误,任何帮助,

实现此功能的第一步是修复缩进并将您的草图转换为实际编译和运行的有效 F# 代码 - 这应该有助于您进入下一步,即修复实施。

与您的代码类似且实际运行的最小代码如下所示:

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
  • 我修复了缩进 - F# 对缩进敏感,所以这很重要。
  • 我用 let 替换了你的 a = abs a - let 关键字定义了一个新变量,隐藏了现有变量(因为你不能改变现有变量 - 它们在 F# 中是不可变的)
  • 我重命名了您的变量以始终使用 divisorvalue 名称
  • 我添加了 printfn 以便您可以看到该函数是如何运行的(它将进入无限循环,因为它目前从不检查终止条件!)
  • 我必须添加类型注释 : int 来表示结果将是 int - 因为你的函数从来没有 returns,这是必需的(但你可以删除它一旦你修复这个)

你可以用更简单的方式计算模数

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