所以我正在尝试学习 R 并使用一些资源,包括一本名为“使用R发现统计数据”和其他一些很酷的电子书。
我理解编程中的一个很好的方法是Euclid的算法。
在循环中实现它可以像这样实现:
gcd(x,y) //assuming x is the largest value
//do
r = x%y;
x = y;
y = r;
//while r != 0;
return x;
经过几次Google搜索,SO和Youtube刷新了我对gcd算法的记忆,我找不到一个不使用循环的内存。甚至递归方法似乎都使用循环。
如何在不使用循环或if语句的情况下在R中实现?
提前致谢。
答案 0 :(得分:21)
使用语句“without loop或if
statement”字面意思,这是一个使用ifelse
的递归版本:
gcd <- function(x,y) {
r <- x%%y;
return(ifelse(r, gcd(y, r), y))
}
有人可能没想到,但这实际上是矢量化的:
gcd(c(1000, 10), c(15, 10))
[1] 5 10
使用if
的解决方案无法处理长度大于1的向量。
答案 1 :(得分:2)
您可以递归地解决它。
euclids <- function(x,y){
theMax = max(x,y)
theMin = min(x,y)
if (theMax == theMin) return (theMax)
else return (euclids(theMin, theMax-theMin))
}
答案 2 :(得分:0)
使用几个模运算很容易。遗憾的是,我将我的个人gcd
代码留在了另一台机器上(远在银河系中) - 但您可以在numbers
或pracma
包中找到来源。
顺便说一句,这是查找现有代码的好方法:library(sos); ???gcd
答案 3 :(得分:0)
减少两个整数的GCD,可以计算任何整数序列(排序或不排序)的GCD:
gcd2 <- function(a, b) {
if (b == 0) a else Recall(b, a %% b)
}
gcd <- function(...) Reduce(gcd2, c(...))