我没有编程背景(除了与R摔跤完成事情),我试图用语言表达R {numbers}包中更大公约数的公式试图在每一步。我需要帮助来理解函数中的步骤流程:
function (n, m)
{
stopifnot(is.numeric(n), is.numeric(m))
if (length(n) != 1 || floor(n) != ceiling(n) || length(m) !=
1 || floor(m) != ceiling(m))
stop("Arguments 'n', 'm' must be integer scalars.")
if (n == 0 && m == 0)
return(0)
n <- abs(n)
m <- abs(m)
if (m > n) {
t <- n
n <- m
m <- t
}
while (m > 0) {
t <- n
n <- m
m <- t%%m
}
return(n)
}
<environment: namespace:numbers>
例如,在if (m > n) {}
部分,n
成为t
,最终成为m
?我不敢问,因为它可能很痛苦,但我不知道发生了什么。同样适用于,我猜,else
等式%%
可能是模数。
答案 0 :(得分:1)
它说的是:
如果m或n不是数字,多个数字或具有小数,则停止并返回消息“Arguments'n','m'必须是整数标量。”
如果它们都为零,则返回零。
从现在开始使用绝对值。
确保n>因为算法我们最终将在下一步中应用。如果不是这种情况则翻转它们:首先将n置于临时变量“t”中,并将m分配给n,以便现在较大的数字位于(n,m)表达式的开头。此时,初始(n,m)值都包含m。通过检索临时变量中的值并将其分配给m。
来完成它现在他们应用修改后的Euclidean algorithm来找到GCD - 一种更有效的算法版本,它可以快速删除多次减法,而不是将两个数字中较大的数字除以其余数除以两者中的较小者。 。
算法开头的较小数字最终会在第一次迭代后变大,因此我们将其分配给n以准备第二次迭代。但是,要做到这一点,我们需要将当前的n分配给临时变量t。之后,我们得到的模数是将原来的较大数字(n)除以现在存储在t中的较小数字m得到的。结果将替换存储在m。
中的数字只要有一个余数(模数),这个过程就会继续进行,这次是最初的较小数字,m扮演大家伙的角色。如果没有余数,则返回该特定迭代中较小的数字。
附录:
现在我知道如何阅读这个函数,我发现它只限于函数输入中的两个数字。所以我自己整理了一个可以在输入中使用三个整数的函数:
require(numbers)
GCF <- function(x,y,z){
tab.x <- tabulate(primeFactors(x))
tab.y <- tabulate(primeFactors(y))
tab.z <- tabulate(primeFactors(z))
max.len <- max(length(tab.x), length(tab.y), length(tab.z))
tab_x = c(tab.x, rep(0, max.len - length(tab.x)))
tab_y = c(tab.y, rep(0, max.len - length(tab.y)))
tab_z = c(tab.z, rep(0, max.len - length(tab.z)))
GCD_elem <- numeric()
for(i in 1:max.len){
GCD_elem[i] <- min(tab_x[i], tab_y[i], tab_z[i]) * i
}
GCD_elem <- GCD_elem[!GCD_elem==0]
GrCD <- prod(GCD_elem)
print(GrCD)
}
同样适用于LCM:
LCM <- function(x,y,z){
tab.x <- tabulate(primeFactors(x))
tab.y <- tabulate(primeFactors(y))
tab.z <- tabulate(primeFactors(z))
max.len <- max(length(tab.x), length(tab.y), length(tab.z))
tab_x = c(tab.x, rep(0, max.len - length(tab.x)))
tab_y = c(tab.y, rep(0, max.len - length(tab.y)))
tab_z = c(tab.z, rep(0, max.len - length(tab.z)))
LCM_elem <- numeric()
for(i in 1:max.len){
LCM_elem[i] <- i^(max(tab_x[i], tab_y[i], tab_z[i]))
}
LCM_elem <- LCM_elem[!LCM_elem==0]
LCM <- prod(LCM_elem)
print(LCM)
}