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 < 3
,因为这是基本情况。 n < 3
涵盖 n = 0
、n = 1
和 n = 2
。你可以写n > 2
,它的工作原理完全相同,但首先说明在非基本情况下要做什么。我想这取决于你如何看待这个问题。
为了检查你的递归函数运行了多长时间,你到底在用什么?以上是关于python中的递归thribonacci函数[关闭]的主要内容,如果未能解决你的问题,请参考以下文章