<p>python允许您将一个变量(<code>catalan.counter</code>在下面的片段中)附加到函数对象,因此您不必一直传递计数器,也不需要全局变量:</p>
<pre><code>def catalan(n):
catalan.counter += 1
if n <= 1:
return 1
res = 0
for i in range(n):
res += catalan(i) * catalan(n-i-1)
return res
catalan.counter = 0
print(catalan(5))
print(catalan.counter)
</code></pre>
<p>并且看到函数被多次调用时使用相同的参数:为了提高效率,您可以使用<a href="https://docs.python.org/3/library/functools.html#functools.lru_cache" rel="noreferrer">^{<cd2>}</a>;但这当然会破坏计算函数被调用次数的目的;您只能得到函数被调用的数字,而该函数是用一个<em>唯一的</em><code>n</code>。在</p>
^{pr2}$
<hr/>
<p>这可能有点离题。。。但是,如果您需要带有单独计数器的函数的单独实例,<a href="https://en.wikipedia.org/wiki/Closure_(computer_programming)" rel="noreferrer">closure</a>可能正是您需要的:</p>
<pre><code>def make_catalan():
counter = 0
def catalan(n):
nonlocal counter
counter += 1
catalan.counter = counter
if n <= 1:
return 1
res = 0
for i in range(n):
res += catalan(i) * catalan(n-i-1)
return res
return catalan
catalan_1 = make_catalan()
print(catalan_1(2))
print(catalan_1.counter)
catalan_2 = make_catalan()
print(catalan_2(3))
print(catalan_2.counter)
</code></pre>