网站首页 > 文章中心 > 其它

尾递归函数python_python递归函数求5的阶乘

作者:小编 更新时间:2023-10-20 07:55:07 浏览量:290人看过

Python的尾递归

原因很多人的都知道,让我们先回顾一下函数调用的大概过程:

①.)调用开始前,调用方(或函数本身)会往栈上压相关的数据,参数,返回地址,局部变量等.

所以呢,在函数 A 执行的时候,如果在第二步中,它又调用了另一个函数 B,B 又调用 C.... 栈就会不断地增长不断地装入数据,当这个调用链很深的时候,栈很容易就满 了,这就是一般递归函数所容易面临的大问题.

而尾递归在某些语言的实现上,能避免上述所说的问题,注意是某些语言上,尾递归本身并不能消除函数调用栈过长的问题,那什么是尾递归呢?在上面写的一般递归函数 func() 中,我们可以看到,func(n) 是依赖于 func(n-1) 的,func(n) 只有在得到 func(n-1) 的结果之后,才能计算它自己的返回值,所以呢理论上,在 func(n-1) 返回之前,func(n),不能结束返回.所以呢func(n)就必须保留它在栈上的数据,直到func(n-1)先返回,而尾递归的实现则可以在编译器的帮助下,消除这个限制

如何看待以及理解Python的这种尾递归优化

TCO,tail-call optimization,其实有多种解读方式.

最常见的解读方式是:对于尾调用的函数调用,不要浪费栈空间,而要复用调用者的栈空间.这样的结果就是一长串尾调用不会爆栈,而没有TCO的话同样的调用就会爆栈.

从这个意义上说,题主贴的那个recipe确实达到了TCO的部分目的:

通过stack introspection查看调用链上的调用者之中有没有自己

有的话,通过抛异常来迫使栈回退(stack unwind)到之前的一个自己的frame

在回退到的frame接住异常,拿出后来调用的参数,用新参数再次调用自己

这样就可以让尾递归不爆栈.但这样做性能是没保证的...而且对于完全没递归过的一般尾调用也不起作用.

一种对TCO的常见误解是:由编译器或运行时系统把尾调用/尾递归实现得很快.这不是TCO真正要强调的事情——不爆栈才是最重要的.也就是说其实重点不在"优化",而在于"尾调用不爆栈"这个语义保证.

"proper tail-call"的叫法远比"tail-call optimization"来得合适.

因而像题主说的那种做法,可以算部分TCO,但算不上"性能优化"意义上的优化.

关于python递归函数怎样理解

递归的思想主要是能够重复某些动作,比如简单的阶乘,次方,回溯中的八皇后,数独,还有汉诺塔,分形.

由于堆栈的机制,一般的递归可以保留某些变量在历史状态中,比如你提到的return

x

*

power...,

但是某些或许庞大的问题或者是深度过大的问题就需要尽量避免递归,因为可能会栈溢出.还有一个问题是~python不支持尾递归优化!!!!所以~还是尽量避免递归的出现.

def

power(x,

n)

if

n

0:

return

-

①.))

0)))

这里n

=

0,

当函数形参n=0的时候,开始回退~直到第一次调用power结束.

python,怎么使用递归的方法,提取括号中的字串符

当递归调用是整个函数体中最后执行的语句且它的返回值不属于表达式的一部分时,这个递归调用就是尾递归.

尾递归函数的特点是在回归过程中不用做任何操作,这个特性很重要,因为大多数现代的编译器会利用这种特点自动生成优化的代码.

如何理解python中的递归函数

递归式方法可以被用于解决很多的计算机科学问题,所以呢它是计算机科学中十分重要的一个概念.

绝大多数编程语言支持函数的自调用,在这些语言中函数可以通过调用自身来进行递归.计算理论可以证明递归的作用可以完全取代循环,所以呢在很多函数编程语言(如Scheme)中习惯用递归来实现循环.

计算机科学家尼克劳斯-维尔特如此描述递归:

递归的强大之处在于它允许用户用有限的语句描述无限的对象.所以呢,在计算机科学中,递归可以被用来描述无限步的运算,尽管描述运算的程序是有限的.

Python进阶 —— 尾递归

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

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

常规递归阶乘:

我们来看一下执行过程:

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

我们再看下执行过程:

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

常规递斐波那契数列:

而尾递归:

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

以上就是土嘎嘎小编为大家整理的尾递归函数python相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!

版权声明:倡导尊重与保护知识产权。未经许可,任何人不得复制、转载、或以其他方式使用本站《原创》内容,违者将追究其法律责任。本站文章内容,部分图片来源于网络,如有侵权,请联系我们修改或者删除处理。

编辑推荐

热门文章