人工智能方向学习第四天

python学习

递归与尾递归

  1. 首先递归函数,最基础的是阶乘函数fact(n):
def fact_1(n):
    if n==1:
        return n
    else:
        return n*fact_1(n-1)
print(fact_1(996))
#结果404811679655420162831420790022976331104216000462782238144742200336205247644000425001380023455725887877332661182012234422662398513667554625559125183750175494535249078026871159454020714510516502918859573449542023999862294744898006230118495142767501715435145265041089160566285629076076178336363528201053913987027748845434312354621661722863758797736458855981576142963091459103732677424890401987134568231087244614105595906645342232879327420946147085954196724127566936349124616300066102117370388363412036425233981845477815011185046055546620917301757756492771065635888864674293769563088462963426740792851986330587635309096777088431448640863849594093521948777168367106371506486939246775690053359128047372704981201216050957815850995317616794725860933532802531158826348491691306029688059858299360263358576862333384009735998395293387429026080874235638038226908635579674766404181076507597588766635763220092337530037307147879826781575922859637829630391178570197160328585405220602485148631125595164151900556314647852382080255912286896393786678011412858888520657328755756160699227883662237202759921294975045219423429510501259091713019267082957446834196429413579460451869638277819259511152171575661282082827578903807281348097603418982659175985155693625226124314100034968312365629319083736897370901169657654939838690080695383790375132216169212100141197120051378591038345020551418612747919141223917722444011908132154387374040610009627412620127028633808652121845338993528482386817340835764118895755181238995866114601200522551164883680604915859905087658440059963032458739097164070762434875795522651345390413977074026066936426196338914804486535147847050688556208028530564361403732613265464311257245412203175859970905977524532647366168887524437996195573183279118914080990437860208484660268377127875232495465460524392647531796201282875186848670097428645768264661017566139854413453224492077737742748441151983997593650371761728047864077647912101617543153294911242272590431005120522705811028347963261142266819933183352084598326160159897408789381646181020352195629310746405586360232922059776286386691007675071877807576966750324364824122374305711531224079319276711080348987206656744884510962266018833136767191786957412246087354318944882557088861362463095008868523738879665272827516489122152128099343151640236439568097909774060082417369088000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

而递归最多只能算996的阶乘,更多就会导致栈溢出,正常函数的运行方式是,进入函数,栈中新开一个栈帧,结束函数,栈帧随之消失,而在计算递归函数的时候,没有结束这个栈帧,因为要一直保存这个return的结果。例如fact(5)
===> fact(5)
===> 5 * fact(4)
===> 5 * (4 * fact(3))
===> 5 * (4 * (3 * fact(2)))
===> 5 * (4 * (3 * (2 * fact(1))))
===> 5 * (4 * (3 * (2 * 1)))
===> 5 * (4 * (3 * 2))
===> 5 * (4 * 6)
===> 5 * 24
===> 120

尾递归

  1. 那我们有没有改进措施呢,其实是有的,尾递归:
def fact(n,value):
    if n==1:
        return value
    else:
        return fact(n-1,n*value) 
print(fact(996,1))

如果我们将每次return的值传给下一个函数,那么就可以实现栈帧的覆盖,从而防止栈溢出,但这样必须要多输一个1,违背方便的原则,我们可以改进一下,设置两个函数:

def fact(n):
    return fact_iter(n, 1)

def fact_iter(num, product):
    if num == 1:
        return product
    return fact_iter(num - 1, num * product)

但如果你将上述代码自己试一下会发现还是不行,不用怀疑自己,你的逻辑没有问题,是因为编译器没有做优化,所以遇到递归次数多的时候还是老老实实用循环吧。
(今天没时间写了,那就直接发了,就当递归函数的专栏了)

  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值