F#:整数(%)整数 - 计算方法如何?

时间:2016-03-07 16:08:24

标签: math recursion f# operators modulus

所以在我的教科书中有一个使用f#

的递归函数的例子
let rec gcd = function
| (0,n) -> n
| (m,n) -> gcd(n % m,m);;

使用此功能,我的教科书通过执行以下内容给出了示例:

gcd(36,116);;

并且由于m = 36而不是0,那么它的第二个句子就是这样:

gcd(116 % 36,36)
gcd(8,36)
gcd(36 % 8,8)
gcd(4,8)
gcd(8 % 4,4)
gcd(0,4) 
and now hits the first clause stating this entire thing is = 4.

我没有得到的是这个(%)百分号/操作符或此连接中调用的任何内容。对于一个实例我不知道如何

116 % 36 = 8

我现在已经把这么多次转过头了,我无法想象这怎么会变成8?

我知道对于那些了解这一点的人来说这可能是一个愚蠢的问题,但我非常感谢你的帮助。

4 个答案:

答案 0 :(得分:8)

% modulo 的可疑版本,它是整数除法的余数。

在积极的情况下,您可以将%视为除法的其余部分。请参阅示例Wikipedia on Euclidean Divison。考虑9 % 4:4适合9次两次。但两次四次只有八次。因此,剩下一个。

如果存在负操作数,%会有效地忽略符号来计算余数,然后使用被除数的符号作为结果的符号。这对应于舍入为零的整数除法的余数,即-2 / 3 = 0

这是一个数学上不寻常的除法和余数的定义,它有一些不好的属性。通常,在计算 modulo n 时,在输入上添加或减去 n 无效。对于此运算符,情况并非如此:2 % 3不等于(2 - 3) % 3

当存在负操作数时,我通常会定义以下内容以获得有用的余数:

/// Euclidean remainder, the proper modulo operation
let inline (%!) a b = (a % b + b) % b

到目前为止,此运算符对于我遇到需要模数的所有情况都有效,而原始%则不是。例如:

  • 从单个索引填充行和列时,您可以计算rowNumber = index / nColscolNumber = index % nCols。但如果indexcolNumber可能为负数,则此映射无效,而欧几里德除法和余数仍为有效。

  • 如果要将角度标准化为(0,2pi),angle %! (2. * System.Math.PI)会完成工作,而“正常”%可能会让您头疼。

    < / LI>

答案 1 :(得分:2)

由于

116 / 36 = 3
116 - (3*36) = 8

答案 2 :(得分:2)

基本上,%运算符(称为modulo operator)会将一个数字除以另一个数字,如果它不能再分割则给出其余数字。通常,你第一次使用它来理解它,如果你想通过在f#中做这样的事情来看一个数字是偶数还是奇数?

let firstUsageModulo = 55 %2 =0 // false because leaves 1 not 0

第一次离开8时意味着它将116除以36,最接近的整数为8给予。

答案 3 :(得分:2)

以后会遇到类似的问题:在Xamarin Studio和Visual Studio等IDE中,如果将鼠标光标悬停在%等操作符上,则应该获得工具提示,因此:

Module operator tool tip

即使您不直接了解工具提示,它也会为您提供google内容。