python allows you to attach a variable (
catalan.counter in the snippet below) to the function object, so you don’t have to pass the counter along all the time and don’t need a global variable:
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)
and seeing that the function is called several times with the same arguments: for more efficiency you could use the
lru_cache; but this of course defeats the purpose of counting how many times the function was called; you’d only get the number the function was called with a unique
from functools import lru_cache @lru_cache(maxsize=128) def catalan(n): ...
this may be a bit off-topic… but in case you need separate instances of the function with separate counters, a closure might be just what you need:
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)