python中的递归thribonacci函数[关闭]

Posted

技术标签:

【中文标题】python中的递归thribonacci函数[关闭]【英文标题】:Recursive thribonacci function in python [closed] 【发布时间】:2022-01-15 21:11:27 【问题描述】:

我了解如何涵盖三个术语(而 n 为 0、1 或 2)作为基本情况,但我怎样才能让我的函数返回三个递归调用?

我正在寻找一个递归 thrib(n) 函数,它在输入 n 时返回 thrib(n)

thrib(0) = 1
thrib(1) = 1
thrib(2) = 1
# if n > 2:
thrib(n) = thrib(n-1) + 2 thrib(n-2) + 3 thrib(n-3)

类似于下面的代码,但这当然会有所不同

def fib(n):
    if n <=1:
        return n
    return fib(n-1)+fib(n-2)


print(fib(2))
print(fib(10))
print(fib(30))
print(fib(40))
print(fib(50))

这个函数的目的是以后创建使用记忆和迭代的函数

【问题讨论】:

我不确定这里有什么困难。只需在 thrib 返回的总和中添加另一个术语。 尝试写thrib;你可能会惊讶于你有多接近。我觉得你想多了。 如果您在我的原始帖子中查看“代码”的第 4 行 thrib =..... 有诸如 + 2 或 + 3 之类的常量,我看不出它们会如何适合返回语句 为什么不呢? return thrib(n-1) + 2*thrib(n-2) + 3*thrib(n-3). 如果没有乘法,这会怎样,所以如果它是 thrib(n-1) + 2、thrib(n-2)+3 等,你能像我刚才那样在语法上按字面意思输入逗号吗? 【参考方案1】:

您可以通过多次递归调用来实现它:

def trib(n): return 1 if n<3 else trib(n-1)+trib(n-2)+trib(n-3)

或使用单个递归调用:

def trib(n,a=1,b=1,c=1): return trib(n-1,b,c,a+b+c) if n else a

或迭代:

def trib(n):
    a = b = c = 1
    for _ in range(n):
        a,b,c = b,c,a+b+c
    return a

【讨论】:

【参考方案2】:
def trib(n):
  if n < 3:
    return 1
  else:
    return trib(n - 1) + trib(n - 2) + trib(n - 3)
for x in range(10):
  print("trib(%d) == %d" % (x, trib(x)))
trib(0) == 1
trib(1) == 1
trib(2) == 1
trib(3) == 3
trib(4) == 5
trib(5) == 9
trib(6) == 17
trib(7) == 31
trib(8) == 57
trib(9) == 105
real    0m0.034s     <-
user    0m0.025s
sys 0m0.008s

对于大于 20 的x,事情开始显着放缓 -

for x in range(20,30):
  print("trib(%d) == %d" % (x, trib(x)))
trib(20) == 85525
trib(21) == 157305
trib(22) == 289329
trib(23) == 532159
trib(24) == 978793
trib(25) == 1800281
trib(26) == 3311233
trib(27) == 6090307
trib(28) == 11201821
trib(29) == 20603361
real    0m30.229s            <-
user    0m13.072s
sys 0m0.065s

将functools.lru_cache 添加到函数中正是您想要的-

from functools import lru_cache   # <-

@lru_cache                        # <-
def trib(n):
  if n < 3:
    return 1
  else:
    return trib(n - 1) + trib(n - 2) + trib(n - 3)
trib(20) == 85525
trib(21) == 157305
trib(22) == 289329
trib(23) == 532159
trib(24) == 978793
trib(25) == 1800281
trib(26) == 3311233
trib(27) == 6090307
trib(28) == 11201821
trib(29) == 20603361
real    0m0.041s
user    0m0.033s
sys 0m0.008s

现在我们可以在几分之一秒内计算出巨大的数字,例如 x = 500 -

trib(500) == 920080768385554537118362247382795511748094060211249395714846663504876568933187764773247307152478284645110957568578400676655207195125
trib(501) == 1692292371018818732848588652741948525682146322571135018598482022598345259010668154715792046832331419615682051662747684749969421243929
trib(502) == 3112610943964882401860542627651146026612901424988062320853721075554798348058448628208346771618611840323992720078687746154459656020977
trib(503) == 5724984083369255671827493527775890064043141807770446735167049761658020176002304547697386125603421544584785729310013831581084284460031
trib(504) == 10529887398352956806536624808168984616338189555329644074619252859811163783071421330621524944054364804524460501051449262485513361724937
trib(505) == 19367482425687094880224660963596020706994232788088153130640023697023982307132174506527257841276398189433238950440150840221057302205945
trib(506) == 35622353907409307358588779299540895387375564151188243940426326318493166266205900384846168910934184538542485180801613934287654948390913
trib(507) == 65519723731449359045350065071305900710707986494606041145685602875328312356409496221994951696264947532500184632293214036994225612321795
trib(508) == 120509560064545761284163505334442816805077783433882438216751952890845460929747571113368378448475530260475908763534978811502937862918653
trib(509) == 221651637703404427688102349705289612903161334079676723302863882084666939552362967720209499055674662331518578576629806782784818423631361
real    0m0.066s    # <-
user    0m0.032s
sys 0m0.008s

没有 lru_cache

如果您想了解 lru_cache 的工作原理,我们可以使用 dict 进行类似的建模 -

mem = dict()

def trib(n):
  # memo read
  if n in mem: return mem[n]
  # memo write
  if n < 3:
    r = 1
  else:
    r = trib(n - 1) + trib(n - 2) + trib(n - 3)
  mem[n] = r
  return r

【讨论】:

你返回“ trib(n - 1) + trib(n - 2) + trib(n - 3) ”而不是“ thrib(n-1) + 2 thrib(n-2) + 3 thrib(n-3) ",为什么? 你需要定义2 thrib(n-2)是什么意思;你是说乘法还是不乘法? 乘法。如果 n 2 返回的不仅仅是 1 @LLMN,如果你想要trib(n - 1) + 2 * trib(n - 2) + 3 * trib(n - 3),就这样写。 lru_cache 在这种情况下仍然同样有效。我使用了n &lt; 3,因为这是基本情况。 n &lt; 3 涵盖 n = 0n = 1n = 2。你可以写n &gt; 2,它的工作原理完全相同,但首先说明在非基本情况下要做什么。我想这取决于你如何看待这个问题。 为了检查你的递归​​函数运行了多长时间,你到底在用什么?

以上是关于python中的递归thribonacci函数[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Python入门之经典函数实例——第1关:递归函数 - 汉诺塔的魅力

python测试开发(01-递归函数+内置函数)

Python入门之模块——第2关:内置模块中的内置函数

Python入门之模块——第2关:内置模块中的内置函数

06python 中的递归函数(python函数)

python中的递归函数