重庆分公司,新征程启航

为企业提供网站建设、域名注册、服务器等服务

python函数能递归么 python递归函数需要满足的基本要素

关于python递归函数怎样理解

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

创新互联专注于海林企业网站建设,成都响应式网站建设公司,商城网站定制开发。海林网站建设公司,为海林等地区提供建站服务。全流程按需设计网站,专业设计,全程项目跟踪,创新互联专业和态度为您提供的服务

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

x

*

power...,

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

def

power(x,

n)

if

n

0:

return

1

return

x

*

power(x,

n

-

1)

power(3,

3)

3

*

power(3,

2)

3

*

(3

*

power(3,

1))

3

*

(3

*

(3

*

power(3,

0)))

3

*

(3

*

(3

*

1))

这里n

=

0,

return

1

3

*

(3

*

3)

3

*

9

27

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

python 递归限制

python不能无限的递归调用下去。并且当输入的值太大,递归次数太多时,python 都会报错

首先说结论,python解释器这么会限制递归次数,这么做为了避免"无限"调用导致的堆栈溢出。

tail recursion 就是指在程序最后一步执行递归。这种函数称为 tail recursion function。举个例子:

这个函数就是普通的递归函数,它在递归之后又进行了 乘 的操作。 这种普通递归,每一次递归调用都会重新推入一个调用堆栈。

把上述调用改成 tail recursion function

tail recursion 的好处是每一次都计算完,将结果传递给下一次调用,然后本次调用任务就结束了,不会参与到下一次的递归调用。这种情况下,只重复用到了一个堆栈。因此可以优化结构。就算是多次循环,也不会出现栈溢出的情况。这就是 tail recursion optimization 。

c和c++都有这种优化, python没有,所以限制了调用次数,就是为了防止无限递归造成的栈溢出。

如果递归次数过多,导致了开头的报错,可以使用 sys 包手动设置recursion的limit

手动放大 recursionlimit 限制:

Python算法-爬楼梯与递归函数

可以看出来的是,该题可以用斐波那契数列解决。

楼梯一共有n层,每次只能走1层或者2层,而要走到最终的n层。不是从n-1或者就是n-2来的。

F(1) = 1

F(2) = 2

F(n) = F(n-1) + F(n-2) (n=3)

这是递归写法,但是会导致栈溢出。在计算机中,函数的调用是通过栈进行实现的,如果递归调用的次数过多,就会导致栈溢出。

针对这种情况就要使用方法二,改成非递归函数。

将递归进行改写,实现循环就不会导致栈溢出

Python进阶:递归算法

  递归算法常用来解决结构相似的问题。

  所谓结构相似,是指构成原问题的子问题与原问题在结构上相似,可以用类似的方法解决。具体地,整个问题的解决,可以分为两部分:第一部分是一些特殊情况,有直接的解法;第二部分与原问题相似,但比原问题的规模小,并且依赖第一部分的结果。

  本质上,递归是把一个不能或不好解决的大问题转化成一个或几个小问题,再把这些小问题进一步分解成更小的问题,直至每个小问题都可以直接解决。

  实际上,递归会将前面所有调用的函数暂时挂起,直到递归终止条件给出明确的结果后,才会将所有挂起的内容进行反向计算。其实,递归也可以看作是一种反向计算的过程,前面调用递归的过程只是将表达式罗列出来,待终止条件出现后,才依次从后向前倒序计算前面挂起的内容,最后将所有的结果一起返回。


网站栏目:python函数能递归么 python递归函数需要满足的基本要素
当前路径:http://cqcxhl.cn/article/dopogoh.html

其他资讯

在线咨询
服务热线
服务热线:028-86922220
TOP