catalan()函数在这里如何工作?

时间:2019-01-02 12:12:50

标签: python recursion catalan

我偶然发现了该函数来计算加泰罗尼亚语数字:

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以外的任何参数如何得到它的值?

1 个答案:

答案 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

wasteful fibonacci

您的catalan程序也发生了类似的问题,但程度甚至更糟。呼叫catalan(3)会产生另外六个呼叫{em> 6 (6)

catalan

可以使用多种技术来避免此问题。请按照上面的引用获取有关该主题的更多帮助。