在R中结合向量化和递归?

von*_*njd 4 recursion r vectorization

我试图在这个阶乘函数的实现中结合向量化和递归:

fac <- function(n) {
  ifelse(n == 1, 1, n * fac(n-1))
}

fac(6)      #720
fac(c(6,7)) #Error: evaluation nested too deeply: infinite recursion / options(expressions=)?
            #Error during wrapup: evaluation nested too deeply: infinite recursion / options(expressions=)?
Run Code Online (Sandbox Code Playgroud)

虽然ifelse是矢量化版本,如果这不起作用(请参阅错误).

我的问题
1.为什么不起作用?
2.我怎样才能使它工作?

编辑:我没有真正看到与建议的副本的连接,因为上面的函数甚至不适用于两个向量!

Rol*_*and 7

让我们来看看会发生什么:

fac <- function(n) {
  ifelse(n == 1, 1, {message(paste(n-1, collapse = ",")); 
                     stopifnot(n > 0); n * fac(n-1)})
}

fac(4:5)
#3,4
#2,3
#1,2
#0,1
#-1,0
# Show Traceback
# 
# Rerun with Debug
# Error: n > 0 are not all TRUE 
Run Code Online (Sandbox Code Playgroud)

如你所见,条件永远不会TRUE适用于所有元素,n因此,递归永远不会停止.

如果所有元素n都相等,则可以:

fac(c(5,5))
#4,4
#3,3
#2,2
#1,1
#[1] 120 120
Run Code Online (Sandbox Code Playgroud)

通过小调整,您的功能也适用于不相等的元素n:

fac <- function(n) {
  ifelse(n <= 1, 1, n * fac(n-1))
}
fac(1:5)
#[1]   1   2   6  24 120
Run Code Online (Sandbox Code Playgroud)