【问题标题】:Catalan number calculation using Python?使用 Python 计算加泰罗尼亚语数?
【发布时间】:2019-08-30 06:46:44
【问题描述】:

我正在编写一个 Python 代码来使用此处给出的数学公式生成加泰罗尼亚数字:

C(0) = 1 和 C(n) = (2(2n - 1) / (n + 1)) * C(n - 1) 每个网站在这里。 (https://rosettacode.org/wiki/Catalan_numbers)

但是,当我在 python 中将它作为函数编写时,它给了我错误的结果。

例如:对于 20 的答案应该是 6564120420.0 而我的代码给了我 344373768。

这里:

def catalan(cat_input):

    if cat_input==0:
    return 1 

    else:
    return  (((4*cat_input) - 2) / (cat_input + 1)) * (catalan(cat_input-1))

有人可以帮我解决这个问题吗?

【问题讨论】:

  • 你所说的“错误结果”是什么意思,举个例子(据我测试,程序给出的正确结果至少高达 9)——除了结果是浮点数而不是整数这可以通过使用// 而不是/ 来修复
  • 对所提问题进行更改以回答您的问题。
  • 对我来说,使用上面的代码,catalan(20) 是 6564120420.0
  • 按预期工作。顺便说一句,你的缩进搞砸了。
  • 因为你们用的是python3而不是python2,看我的回答

标签: python catalan


【解决方案1】:

问题是在划分/时。原样的结果(除法本身,在相乘之前)可能不是整数,并且由于 python2 中的/ 默认情况下是 int-division 小数部分被“裁剪”,你会得到错误的结果。

有几种方法可以解决这个问题(选择你最喜欢的):

  • 更改等式中的顺序,而不是(((4*cat_input) - 2) / (cat_input + 1)) * (catalan(cat_input-1)) 使用(((4*cat_input) - 2) * (catalan(cat_input-1)) / (cat_input + 1)),这样可以保证除法后得到整数
  • 将等式第一部分的类型更改为float以强制浮点除法:(float((4*cat_input) - 2) / (cat_input + 1)) * (catalan(cat_input-1))
  • 使用python3代替python2,因为python3默认使用十进制除法
  • 使用from __future__ import division“激活”类似python3的除法

编辑:一般情况下(至少在 python 中),如果可能,建议不要使用递归,因为它效率不高,并且可能会遇到递归限制等问题

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-05
    • 2012-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多