递归 R 函数及其 Python 翻译的行为不同

问题描述 投票:0回答:1

这是一个递归 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 函数具有相同的行为。

python r recursion
1个回答
0
投票

首先,我对 R 代码不太熟悉,但似乎从 R 到 Python 的错误转换导致了一次性错误。下面的 python 代码产生与您提供的 R 代码相同的结果。

1幅插图

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))
© www.soinside.com 2019 - 2024. All rights reserved.