第一段:使用递归的背景
先来看一个?接口结构:
可以理解为children是个对象,他包含了一些属性,特别的是其中有一个属性与父级children是一模一样的,他包含父级children所有的属性.
比如每个children都包含了一个name字段,我们要拿到所有children里name字段的值,这时候就要用到递归啦~
第二段:find_children.py
拆分理解:
①首先import requests库,用它请求并获取接口返回的数据
我们的函数调用:find_children(node_f, 'children')
其中,node_f:json字段
children:递归对象
以下这段是实现递归的核心:
if items['children']:
items['children']不为None,表示该元素下的children字段还有子类数据值,此时满足if条件,可理解为 if 1.
items['children']为None,表示该元素下children值为None,没有后续可递归值,此时不满足if条件,可理解为 if 0,不会再执行if下的语句(不会再递归).
至此,每一层级中children的name以及下一层级children的name就都取出来了
希望到这里能让粉丝们变的更强理解递归的思路,以后根据这个模板直接套用就行
(晚安啦~)
源码参考:
可以看出来的是,该题可以用斐波那契数列解决.
F(1) = 1
这是递归写法,但是会导致栈溢出.在计算机中,函数的调用是通过栈进行实现的,如果递归调用的次数过多,就会导致栈溢出.
针对这种情况就要使用方法二,改成非递归函数.
将递归进行改写,实现循环就不会导致栈溢出
python不能无限的递归调用下去.并且当输入的值太大,递归次数太多时,python 都会报错
首先说结论,python解释器这么会限制递归次数,这么做为了避免"无限"调用导致的堆栈溢出.
tail recursion 就是指在程序最后一步执行递归.这种函数称为 tail recursion function.举个例子:
这个函数就是普通的递归函数,它在递归之后又进行了 乘 的操作. 这种普通递归,每一次递归调用都会重新推入一个调用堆栈.
把上述调用改成 tail recursion function
tail recursion 的好处是每一次都计算完,将结果传递给下一次调用,然后本次调用任务就结束了,不会参与到下一次的递归调用.这种情况下,只重复用到了一个堆栈.所以呢可以优化结构.就算是多次循环,也不会出现栈溢出的情况.这就是 tail recursion optimization .
c和c++都有这种优化, python没有,所以限制了调用次数,就是为了防止无限递归造成的栈溢出.
如果递归次数过多,导致了开头的报错,可以使用 sys 包手动设置recursion的limit
手动放大 recursionlimit 限制:
递归的思想主要是能够重复某些动作,比如简单的阶乘,次方,回溯中的八皇后,数独,还有汉诺塔,分形.
由于堆栈的机制,一般的递归可以保留某些变量在历史状态中,比如你提到的return x * power..., 但是某些或许庞大的问题或者是深度过大的问题就需要尽量避免递归,因为可能会栈溢出.还有一个问题是~python不支持尾递归优化!!!!所以~还是尽量避免递归的出现.
def power(x, n)
if n 0:
return 1
return x * power(x, n - 1)
当函数形参n=0的时候,开始回退~直到第一次调用power结束.
以上就是土嘎嘎小编为大家整理的python递归函数优化相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!