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

Rea*_*ion 13 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;
Run Code Online (Sandbox Code Playgroud)

在Google上进行了几次搜索后,SO和Youtube刷新了我对gcd算法的记忆,我找不到一个不使用循环的内存.甚至递归方法似乎都使用循环.

如何在不使用循环或if语句的情况下在R中实现这一点?

提前致谢.

Mat*_*erg 23

if从字面上使用语句"无循环或语句",这是一个递归版本,它使用ifelse:

gcd <- function(x,y) {
  r <- x%%y;
  return(ifelse(r, gcd(y, r), y))
}
Run Code Online (Sandbox Code Playgroud)

有人可能没想到,但这实际上是矢量化的:

gcd(c(1000, 10), c(15, 10))
[1]  5 10
Run Code Online (Sandbox Code Playgroud)

使用的解决方案if不会处理长度大于1的向量.


egn*_*nha 6

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

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

gcd <- function(...) Reduce(gcd2, c(...))
Run Code Online (Sandbox Code Playgroud)