math - F#:整数 (%) 整数 - 是如何计算的?

标签 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 次?

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

最佳答案

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

在积极方面,你可以想到 %作为除法的剩余部分。参见例如 Wikipedia on Euclidean Divison .考虑 9 % 4 : 4 两次进入 9。但是二乘以四只是八。因此,有一个的余数。

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

这是除法和余数的数学上不寻常的定义,具有一些不良属性。通常,在计算模 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)完成工作,而“正常”%可能会让你头疼。
  • 关于math - F#:整数 (%) 整数 - 是如何计算的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35848489/

    相关文章:

    python - 两点之间的曲线方程,而曲线极限由两点定义

    java - Java 中的基本递归算法

    kotlin - 我如何让这个序列变得懒惰?

    f# - 使用 F# 进行优化

    asp.net-core - View 和静态文件的 Asp.Net Core 问题 (F#)

    algorithm - 在矩阵匹配模式中寻找漏洞的矩阵算法

    python - 以对数方式拆分 Python 列表

    algorithm - 给定 N,找出 A^A 能被 N 整除的最小数 A

    javascript - 对象嵌套属性访问

    f# - 遍历 F# 二维数组