【发布时间】:2017-03-16 12:14:57
【问题描述】:
我正在使用 Python 中的递归函数。我使用记忆来加快计算速度。
如果n >= 333 (YMMV),则以下 sn-p 失败并返回 RecursionError(“比较中超出最大递归深度”):
from scipy.special import binom
from sys import argv
def memoized(func):
cache = {}
def new_func(*args):
if args in cache:
return cache[args]
else:
temp = cache[args] = func(*args)
return temp
return new_func
def p(N, n, k):
return binom(n, k) * (1 / N)**k * (1 - 1/N)**(n-k)
@memoized
def X(n):
if n <= 1:
return 1
s = 0
for k in range(1,n):
s += p(2, n, k) * (X(k)+X(n-k))
return (1 + (1/2)**(n-1) * X(0) + s) / (1 - (1/2)**(n-1))
n = int(argv[1])
print('efficiency: ' + str(X(n) / n))
但是,如果我将 for 循环分成两个不同的总和,它会按预期工作,n 的值更大:
from scipy.special import binom
from sys import argv
def memoized(func):
cache = {}
def new_func(*args):
if args in cache:
return cache[args]
else:
temp = cache[args] = func(*args)
return temp
return new_func
def p(N, n, k):
return binom(n, k) * (1 / N)**k * (1 - 1/N)**(n-k)
@memoized
def X(n):
if n <= 1:
return 1
s1 = 0
for k in range(1,n):
s1 += p(2, n, k) * X(k)
s2 = 0
for k in range(1,n):
s2 += p(2, n, k) * X(n-k)
return (1 + (1/2)**(n-1) * X(0) + s1+s2) / (1 - (1/2)**(n-1))
n = int(argv[1])
print('efficiency: ' + str(X(n) / n))
这是为什么呢?为什么同一行调用两次X()函数会影响是否超过递归深度?
【问题讨论】:
-
尝试记录正在调用的 n 的值,或者用铅笔和纸手工追踪它。
-
@JoshLee 第一个 sn-p 使用
n-1直到达到 1,第二个 sn-p 反过来(1 到n)