我偶然发现了该函数来计算加泰罗尼亚语数字:
def catalan(n):
if n == 0:
return 1
else:
sum = 0
for i in range (n):
sum +=(catalan(i))*(catalan(n-1-i))
return sum
我的问题是sum
如何在例如n=2
时获取值:
sum = (catalan(0))*(catalan(2-1-0)) + (catalan(1))*(catalan(2-1-1) + (catalan(2))*(catalan(2-1-2))
如果我们仅为catalan(2-1-0)
定义值,那么n=1
或除0以外的任何参数如何得到它的值?
答案 0 :(得分:2)
笔和纸评估
加泰罗尼亚(0)
# 1
加泰罗尼亚(1)
# = 0 + catalan (0) * catalan (1-1-0)
# = 0 + 1 * catalan (0)
# = 0 + 1 * 1
# = 0 + 1
加泰罗尼亚(2)
# = 0
# + catalan (0) * catalan (2-1-0)
# + catalan (1) * catalan (2-1-1)
# = 0
# + 1 * catalan (1)
# + 1 * catalan (0)
# = 0
# + 1 * 1
# + 1 * 1
# = 1
# + 1
# = 2
加泰罗尼亚(3)
# = 0
# + catalan (0) * catalan (3-1-0)
# + catalan (1) * catalan (3-1-1)
# + catalan (2) * catalan (3-1-2)
# = 0
# + 1 * catalan (2)
# + 1 * catalan (1)
# + 2 * catalan (0)
# = 0
# + 1 * 2
# + 1 * 1
# + 2 * 1
# = 0
# + 2
# + 1
# + 2
# = 5
浪费的循环
让我们看一个天真的斐波那契过程–
def fib (n):
if n < 2:
return n
else:
return fib (n-1) + fib (n-2)
此过程对于典型的树递归来说是有启发性的,但是它是计算斐波那契数的一种糟糕方法,因为它执行了很多冗余计算。请注意,下面fib(3)
的整个计算(几乎完成了一半的工作)是重复的。实际上,不难证明该过程将计算fib(1)
或fib(0)
的次数(通常,上述树中的叶子数)正好为fib(n + 1)
。要了解这有多严重,可以证明fib(n)
的值与n
呈指数增长-SICP - Tree Recursion
您的catalan
程序也发生了类似的问题,但程度甚至更糟。呼叫catalan(3)
会产生另外六个呼叫{em> 6 (6)
catalan
可以使用多种技术来避免此问题。请按照上面的引用获取有关该主题的更多帮助。