首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这里的catalan()函数是如何工作的?

这里的catalan()函数是如何工作的?
EN

Stack Overflow用户
提问于 2019-01-02 12:12:50
回答 1查看 109关注 0票数 0

我无意中发现了这个函数来计算加泰罗尼亚数字:

代码语言:javascript
复制
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)定义值,那么catalan(2-1-0)或0以外的任何参数如何获得它的值?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-02 17:55:33

笔与纸张评价

加泰罗尼亚(0)

代码语言:javascript
复制
# 1

加泰罗尼亚人(1)

代码语言:javascript
复制
#  = 0 + catalan (0) * catalan (1-1-0)
#  = 0 + 1 * catalan (0)
#  = 0 + 1 * 1
#  = 0 + 1

加泰罗尼亚(2)

代码语言:javascript
复制
#  = 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)

代码语言:javascript
复制
#  = 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

废品循环

让我们来看看一个天真的斐波纳契过程-

代码语言:javascript
复制
def fib (n):
  if n < 2:
    return n
  else:
    return fib (n-1) + fib (n-2)

这个过程作为一个原型树递归是有指导意义的,但是它是计算Fibonacci数的糟糕方法,因为它做了大量的冗余计算。请注意,fib(3)的整个计算(几乎一半的工作量)都是重复的。事实上,不难证明该过程计算fib(1)fib(0)的次数(通常是上述树中的叶数)正是fib(n + 1)。为了了解这种情况有多糟糕,人们可以看到fib(n)的值随n-http://www.sicpdistilled.com/section/1.2.2/而呈指数增长。

一个类似的问题正在发生在您的catalan程序,但更糟糕的程度。调用catalan(3)将产生6个额外的catalan调用

代码语言:javascript
复制
# catalan (3)
#  = 0
#  + catalan (0) * catalan (3-1-0)
#  + catalan (1) * catalan (3-1-1)
#  + catalan (2) * catalan (3-1-2)
#  ...
#  = 5

可以使用多种技术来避免这个问题。请按照上面的引文来获得更多关于这个主题的帮助。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54006167

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档