这是一个递归 R 函数,涉及来自父环境的矩阵
S
:
f <- function(m, k, n) {
if(n == 0) {
return(100)
}
if(m == 1) {
return(0)
}
if(!is.na(S[m, n])) {
return(S[m, n])
}
s <- f(m-1, 1, n)
i <- k
while(i <= 5) {
if(n > 2) {
s <- s + f(m, i, n-1)
} else {
s <- s + f(m-1, 1, n-1)
}
i <- i + 1
}
if(k == 1) {
S[m, n] <- s
}
return(s)
}
这是调用此函数的结果:
> n <- 4
> S <- matrix(NA_real_, nrow = n, ncol = n)
> f(n, 1, n)
[1] 127500
现在,这是 Python 版本:
import numpy as np
def f(m, k, n):
if n == 0:
return 100
if m == 1:
return 0
if S[m-1, n-1] is not None:
return S[m-1, n-1]
s = f(m-1, 1, n)
i = k
while i <= 5:
if n > 2:
s = s + f(m, i, n-1)
else:
s = s + f(m-1, 1, n-1)
i = i + 1
if k == 1:
S[m-1, n-1] = s
return s
来电:
>>> n = 4
>>> S = np.full((n, n), None)
>>> f(n, 1, n)
312500
Python 结果与 R 结果不同。为什么?
更换一个会得到相同的结果
if S[m-1, n-1] is not None:
return S[m-1, n-1]
与
if k == 1 and S[m-1, n-1] is not None:
return S[m-1, n-1]
我还有这个函数的 C++ 版本,它与 R 函数具有相同的行为。
首先,我对 R 代码不太熟悉,但似乎从 R 到 Python 的错误转换导致了一次性错误。下面的 python 代码产生与您提供的 R 代码相同的结果。
import numpy as np
def f(m, k, n):
if n == 0:
return 100
if m == 1:
return 0
if S[m-1, n-1] is not None:
return S[m-1, n-1]
s = f(m-1, 1, n)
i = k
while i <= 5:
if n > 2:
s = s + f(m, i, n-1)
else:
s = s + f(m-1, 1, n-1)
i = i + 1
if k == 0:
S[m, n] = s
return s
n = 4
S = np.full((n, n), None)
print(f(n, 1, n))