在没有循环的情况下找到GCD - R.

时间:2014-02-01 18:59:21

标签: r greatest-common-divisor

所以我正在尝试学习 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中实现?

提前致谢。

4 个答案:

答案 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代码留在了另一台机器上(远在银河系中) - 但您可以在numberspracma包中找到来源。

顺便说一句,这是查找现有代码的好方法: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(...))