13

因此,我正在尝试学习R并使用许多资源,包括一本名为“使用 R 发现统计数据”的书和一堆其他很酷的电子书。

我知道编程中的一个很好的方法是欧几里得算法。

在循环中实现它可以这样实现:

 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

4 回答 4

23

从字面上使用“没有循环或if语句”的语句,这是一个使用的递归版本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 的向量。

于 2014-02-01T21:51:59.417 回答
2

您可以递归地解决它。

euclids <- function(x,y){
        theMax = max(x,y)
        theMin = min(x,y)

        if (theMax == theMin) return (theMax)
        else return (euclids(theMin, theMax-theMin))
}
于 2017-05-26T01:56:02.413 回答
1

减少两个整数的 GCD 使您能够计算任何整数序列(排序或未排序)的 GCD:

gcd2 <- function(a, b) {
  if (b == 0) a else Recall(b, a %% b)
}

gcd <- function(...) Reduce(gcd2, c(...))
于 2018-08-04T12:02:23.090 回答
0

通过几个模运算很容易做到。可悲的是,我将我的个人gcd代码留在了另一台机器上(在遥远的星系中) - 但你可以在numberspracma包中找到源代码。

顺便说一句,这是查找现有代码的好方法: library(sos); ???gcd

于 2014-02-01T19:29:58.327 回答