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

时间:2016-12-13 23:38:17

标签: f# c#-to-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)

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

2 个答案:

答案 0 :(得分:9)

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

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

<img class="img-responsive"  src="images/pic.png" alt="">
  • 我修正了缩进 - F#是缩进敏感的,所以这很重要。
  • 我将img{ max-width: 100%; height: auto; // to maintain aspect ratio } 替换为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 - a = abs a关键字定义了一个新变量,隐藏了现有变量(因为您不能改变现有变量 - 它们在F#中是不可变的)
  • 我将您的变量重命名为始终使用letlet名称
  • 我添加了divisor,以便您可以看到该函数如何运行(它将进入无限循环,因为它当前从不检查终止条件!)
  • 我必须添加类型注释value来表示结果将是printfn - 因为您的函数永远不会返回,这是必需的(但是一旦修复它就可以删除它)

答案 1 :(得分:0)

您可以更简单地计算模数

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