使用递归生成数字序列 python
Generating sequence of numbers with recursion python
目标是生成加泰罗尼亚数字!我的代码工作到 n = 30(我在 JAVA 中尝试了相同的算法并且它是完全正确的,但是,然后 python 发生了一些奇怪的事情,它在 n=30 之后返回了错误的数字。我'我完全确定存在关于舍入或格式的问题,但我自己无法解决!
def catalan(n):
if n < 0:
return -1
else:
if n == 0:
return 1
else:
c_n = (4*n-2)/(n+1)*catalan(n-1)
return int(c_n)
通过使用 /(n+1)
,您可以生成一个浮点数,其本质上具有有限的精度。对于 n > 30 出现的较大数字,此精度不够准确。
因此,改用一个坚持整数的公式:先乘,然后才执行除法,整数除法:
c_n = (4*n-2)*catalan(n-1)//(n+1)
到 int
的转换也是不必要的,你可以这样做:
return c_n
旁注:当您在语句的 if
部分中 return
时,您不需要 else
。所以你可以这样写:
def catalan(n):
if n < 0:
return -1
if n == 0:
return 1
return (4*n-2)*catalan(n-1)//(n+1)
目标是生成加泰罗尼亚数字!我的代码工作到 n = 30(我在 JAVA 中尝试了相同的算法并且它是完全正确的,但是,然后 python 发生了一些奇怪的事情,它在 n=30 之后返回了错误的数字。我'我完全确定存在关于舍入或格式的问题,但我自己无法解决!
def catalan(n):
if n < 0:
return -1
else:
if n == 0:
return 1
else:
c_n = (4*n-2)/(n+1)*catalan(n-1)
return int(c_n)
通过使用 /(n+1)
,您可以生成一个浮点数,其本质上具有有限的精度。对于 n > 30 出现的较大数字,此精度不够准确。
因此,改用一个坚持整数的公式:先乘,然后才执行除法,整数除法:
c_n = (4*n-2)*catalan(n-1)//(n+1)
到 int
的转换也是不必要的,你可以这样做:
return c_n
旁注:当您在语句的 if
部分中 return
时,您不需要 else
。所以你可以这样写:
def catalan(n):
if n < 0:
return -1
if n == 0:
return 1
return (4*n-2)*catalan(n-1)//(n+1)