python干活系列----递归

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m0_37479946/article/details/79973315

虽然把递归纳入了python底下,但是递归只是一个概念,很多种语言都可以使用递归,如js

对于资深程序员来说递归不算什么,对于小白来说这个词他可能觉得很厉害,但是具体使用场景以及局限性可能了解的并不是特别多。首先将几个缺点减少一下你对递归的期待吧

  1. 递归的执行速度特别慢
  2. 递归特别耗内存,容易造成内存溢出(耗内存的原因下文会解释)
  3. 必须要有一个约束条件,没有就会变成死循环,最终导致内存不足

你一看,那我用它干嘛,这么可怕。先列举他的缺点就是让你明白能不用就不用,但是还要说他是因为有些场景你不用不行,碰到这些情况的时候你就会觉得他老牛逼了。
例子一:
1.打印下面的地点名称
2.查看地区是否在列表里

[
    {
        "text":"北京",
        "children":[
            {"text":"朝阳","children":[]},
            {"text":"昌平","children":[
                {"text":"沙河","children":[]},
                {"text":"回龙观","children":[]}
            ]},
        ]
    },
    {
        "text":"上海",
        "children":[
            {"text":"宝山","children":[]},
            {"text":"金山","children":[]},
        ]
    }
]

你乍一看可能觉得这有什么难的,可你写起来的时候你会发现没法循环嵌套的,原因很简单就是因为他嵌套了几层你不知道。这种典型的问题就要用到递归了,话不多说直接上代码:

需求一答案:

def recursion(list):
    for item in list:
        print(item["text"])
        recursion(item["children"])
recursion(list)

需求二答案:

def recursion(list,name):
    for item in list:
        if item["text"]==name:
            return True
        else:
            if recursion(item["children"],name):
                return True
            else:
                return False
print(recursion(list,"沙河"))->True
print(recursion(list,"MrXu"))->False

如果你不是只寻求答案,而是很仔细的看了这段代码你会发现,这里面有好多return,直接找到了结果返回一个True,找不到结果返回一个False不就可以了么为什么还要再加入下面的代码呢?
我将上面的代码改造一下:

def isRecursion(list,name):
    for item in list:
        if item["text"]==name:
            return True
        else:
            isRecursion(item["children"],name)

我在接着调用isRecursion(list,”沙河”),结果返回了None,这里你必须要明白你得到的返回值一定是最外面这一层的,当你输入沙河的时候第一层嵌套是不是没有返回值呢,所以你需要层层都有返回值才行。这里有点绕但是你必须要搞懂

上面这俩个需求也是递归最常用的场合,很经典。

在这里解释一下为什么递归会有那三个缺点:

首先递归是函数嵌套的,大家都知道函数没有执行完的时候回一直存活在内存里面,也就是里面调用了外面时外面的函数是还没有执行完的,当一直嵌套的时候外面的就会一直被挂在内存里。举个例子吧,让你更好的理解一下:

# 递归里面的执行的时候外面的真的没有执行完毕
def isComplete(num):
    num=int(num/2)
    print(num)
    if num:
        isComplete(num)
    print(num)
isComplete(4)
#结果: 2 1 00 1 2

0之后又重新打印了1跟2就证明了这个事情,这也导致了递归的另外俩个缺点就是,执行速度慢和必须要有限制条件

例子来源于路费学城的的21天python,目前博主正在看,主讲alex讲的非常棒,很适合小白入门。并不是在做广告,而是希望能够帮助到更多想要进军计算机行业的人
想第一时间获取博主资料可关注吵吵日记
这里写图片描述

阅读更多

没有更多推荐了,返回首页