
下面是笔者的个人理解: 把计算出的值存在函数内部(当然不止尾递归)是其计算方法,从而不用在栈中去创建一个新的,这样就大大节省了空间。函数调用中最后返回的结果是单纯的递归函数调用(或返回结果)就是尾递归。
实例还是和笔者的上一篇文章相同,建议读者阅读 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递归的问题 求教等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)