在 R 中结合矢量化和递归?
Combining vectorization and recursion in R?
我试图在这个阶乘函数的实现中结合向量化和递归:
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=)?
尽管 ifelse 是 if 的矢量化版本,但这不起作用(查看错误)。
我的问题
1. 为什么不起作用?
2. 我怎样才能让它发挥作用?
编辑:我真的看不出与建议的副本之间的联系,因为上述函数甚至不适用于两个向量!
您可以使用Vectorize
vfac <- Vectorize(fac)
vfac(c(6,7))
# [1] 720 5040
让我们看看会发生什么:
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
如您所见,n
的所有元素的条件永远不会是 TRUE
,因此,递归永远不会停止。
如果 n
的所有元素都相等,则有效:
fac(c(5,5))
#4,4
#3,3
#2,2
#1,1
#[1] 120 120
稍作调整,您的函数也适用于 n
的不相等元素:
fac <- function(n) {
ifelse(n <= 1, 1, n * fac(n-1))
}
fac(1:5)
#[1] 1 2 6 24 120
我试图在这个阶乘函数的实现中结合向量化和递归:
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=)?
尽管 ifelse 是 if 的矢量化版本,但这不起作用(查看错误)。
我的问题
1. 为什么不起作用?
2. 我怎样才能让它发挥作用?
编辑:我真的看不出与建议的副本之间的联系,因为上述函数甚至不适用于两个向量!
您可以使用Vectorize
vfac <- Vectorize(fac)
vfac(c(6,7))
# [1] 720 5040
让我们看看会发生什么:
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
如您所见,n
的所有元素的条件永远不会是 TRUE
,因此,递归永远不会停止。
如果 n
的所有元素都相等,则有效:
fac(c(5,5))
#4,4
#3,3
#2,2
#1,1
#[1] 120 120
稍作调整,您的函数也适用于 n
的不相等元素:
fac <- function(n) {
ifelse(n <= 1, 1, n * fac(n-1))
}
fac(1:5)
#[1] 1 2 6 24 120