Python进阶 —— 尾递归

Python进阶 —— 尾递归,第1张

下面是笔者的个人理解: 把计算出的值存在函数内部(当然不止尾递归)是其计算方法,从而不用在栈中去创建一个新的,这样就大大节省了空间。函数调用中最后返回的结果是单纯的递归函数调用(或返回结果)就是尾递归。

实例还是和笔者的上一篇文章相同,建议读者阅读 Python —— 递归

常规递归阶乘:

我们来看一下执行过程:

但是如果把上面的函数写成如下形式:

我们再看下执行过程:

很直观的就可以看出,这次的 factorial 函数在递归调用的时候不会产生一系列逐渐增多的中间变量了,而是将状态保存在 acc 这个变量中。而这种形式的递归,就叫做尾递归。

常规递斐波那契数列:

而尾递归:

一下子就充满了逼格,还高效了许多,何乐而不为呢!

看了你的代码,你这里面是没有用到递归的

至于你的输出,fsplit_path()输出的是('C:\\Users\\Lin\\workspace\\python_io\\src', 'linhtxt'),那是因为你在split_path()里的处理时这样的,因为ospathsplit是将完整路径分隔成路径和文件名。你这里先合起来,再分隔,没太搞懂是要做什么。我给你做下注释

path=path + "\\" + selffileName   #'C:\\Users\\Lin\\workspace\\python_io\\src' + 'linhtxt'

parent_path, name=ospathsplit(path) # parent_path='C:\\Users\\Lin\\workspace\\python_io\\src'

#name= 'linhtxt'

return (parent_path, name)

在split_fully()函数里,你调用了两次split_path(),第一次返回的parent_path再一次执行了ospathsplit,它将你的路径再从最后切了一个'src'出来,

我这里只是打印了一下,你可以插入到列表或作其他处理。看看你的需求是不是这个样子:

path = 'C:\\Users\\Lin\\workspace\\python_io\\src\\linhtxt'

def getsinglepath(path):

path,singlepath = ospathsplit(path)

if singlepath == '':

return ''

else:

print singlepath

return getsinglepath(path)

getsinglepath(path)

>>> getsinglepath(path)

linhtxt

src

python_io

workspace

Lin

Users

''

首先,os是标准库的一个模块,而非函数。

递归没有什么特殊的地方,只是调用一个函数。巧的是,这个函数就是自己而已。你可以想象“查找文件”这个函数有无数个备份,而每次递归遇到就随便哪来用一个,和普通的函数调用没有什么区别。

所以,返回父目录就是在查找文件函数执行完成后执行的。

把你的手掌伸直,五指分开,从手腕开始沿着肉的边缘走一圈,最终又会回到手腕起点(忽略宽度),哪怕你的手指上又长出若干个小手指,沿着边缘走一圈,总会回到手腕。这就是递归执行的过程,每个手指就是一个递归调用。你可以在纸上画一个树状结构,设置三层目录,按照函数的调用过程来理解。

或者可以这么理解,假如国家要进行人口普查,就可以让每个省把自己的人口普查的结果回报上来,然后加起来就可以了。那么国家在加的时候,必须要等所有省都普查完后才能进行加(相当于你的返回上级目录的 *** 作)。对于每个省来说,类似的,只要让每个市进行人口普查,然后把结果相加即可。每个省也都要等到它的所有市都普查完毕后才能相加。同理,每个市对于每个县也是同样的 *** 作。这就是递归的过程。——但需要注意的是,所有县的普查可以同时进行,但计算机递归却是一个完成后才能进行下一个。和画手指是一样的,必须一个手指画完后才能进行下一个。

以上就是关于Python进阶 —— 尾递归全部的内容,包括:Python进阶 —— 尾递归、求指点python递归、小白有一个关于python递归的问题 求教等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/web/10157545.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-05
下一篇2023-05-05

发表评论

登录后才能评论

评论列表(0条)

    保存