我已经实现了我的代码,它基本上是在不使用模数运算符的情况下计算两个数字的余数但是,我陷入了一种只是忙乱的情况。我知道逻辑,但我是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)
我所知道的是,我在这里遇到一个非常基本的错误,任何帮助,
答案 0 :(得分:9)
实现此功能的第一步是修复缩进并将草图转换为实际编译和运行的有效F#代码 - 这应该有助于您进入下一步,即修复实现的逻辑。
与您的类似的实际运行的最小代码如下所示:
<img class="img-responsive" src="images/pic.png" alt="">
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#中是不可变的)let
和let
名称divisor
,以便您可以看到该函数如何运行(它将进入无限循环,因为它当前从不检查终止条件!)value
来表示结果将是printfn
- 因为您的函数永远不会返回,这是必需的(但是一旦修复它就可以删除它)答案 1 :(得分:0)
您可以更简单地计算模数
let modulus a b=
if b = 0.0 then failwith "Cannot divide by zero"
a - b * truncate(a / b);