如何在R中编写递归函数?

时间:2014-02-11 10:03:44

标签: r recursion combinations

如何编写递归函数来获得R中的组合(n,r)=组合(n-1,r-1)+组合(n-1,r)?  我尝试了以下代码,但我只收到一条错误消息:

nCr=function(n, r) {
if (r == 0)
{
if (r == n) {

return (1)
} } else {
return (nCr(n-1, r-1) + nCr(n-1, r)) 
}
}

谢谢!

1 个答案:

答案 0 :(得分:6)

相关问题:onetwo

nCr <- function(n, r) {
  if (r == 0 | r == n) return (1)
  else return (nCr(n-1, r-1) + nCr(n-1, r)) 
}

nCr(20, 6)
[1] 38760
choose(20, 6)
[1] 38760

注意内置功能的性能。

system.time(for(i in 1:10) nCr(20, 6))
##    user  system elapsed 
##    8.74    0.00    8.90 

system.time(for(i in 1:10) choose(20, 6))
##    user  system elapsed 
##       0       0       0 

部分出现性能问题是因为多次使用相同的输入调用函数。您可以通过缓存结果使nCr更快 - 这种技术对许多递归函数很有用,但请注意内置函数仍然快得多。

library(memoise)
nCr2 <- memoise(nCr)
system.time(for(i in 1:10) nCr2(20, 6))
##    user  system elapsed 
##    0.88    0.00    0.91