你连递归算法都不会,还想进大厂

递归算法:
        通俗讲就是:自己调用自己
???什么是自己调用自己?就是如此:

# 先来定义一个小函数,并调用自己
def _func():
    print("我是_func函数")
    _func()  # 调用自己

_func()

我们看这个函数,在这个函数的里面,再次调用函数自己,这个就是所谓的递归,也就是自己调用自己

注意啦敲黑板划重点!!!
这个一旦执行的话,会成为一个死循环,因为,你在内部一直调用,外部也在调用
外部调用,他就会执行里面的功能,就是这样

在这里插入图片描述

函数执行第一步后,找到函数,执行第二步,最后它会一直不断的执行步骤3和4

直到最后报错:RecursionError: maximum recursion depth exceeded while calling a Python object

这个报错的意思就是:这个程序超过最大递归深度

这是python的一个大坑吧算是,在python里面,每次调用一个函数
它会在内存里面开辟一块空间,我们先称呼这个空间为A吧

然后我们看函数里面又是再次调用函数,这个又会开辟内存空间,注意这个空间开辟开第一次A的空间里

如此的调用,开辟空间,总会有这块内存空间撑不住的时候

别的语言也有这个问题,比如C什么的,然后这个python的话,是有一个递归的最大限度,超过就报错

当然你可以改,官方给的最大的是 1000 ,超过1000就报错,但是你实际测试是到不了1000的

改一下程序试试:

a = 1
def _func():
    global a
    print(a, "我是_func函数")
    _func()

_func()

在这里插入图片描述

到996就报错了,当然你这个是可以改递归深度的

import sys
print(sys.getrecursionlimit()) #1000

sys.setrecursionlimit(5000)

这个是修改为了5000,同样你是到不了5000的

递归在使用中,使用最高的一个点就是:树形结构遍历
灵魂画手上线哈哈哈。。
在这里插入图片描述
我们看这个第一层上面的就是,可以用过第一层然后进行用递归的方法找到第二层的节点
然后又可以通过递归的方法,从第二层找到第三的的节点,如此就会体现递归的思想

从根节点找到子节点,然后把子节点当成根节点,继续寻找

那么举例子的话就是,操作系统吧,不光哪个操作系统都是,这样,比如就是C盘下面包括一些文件夹,比如,a、b、c、d

然后这四个文件夹有包括别的文件夹e、f、g等等,可能下面还包括其他的文件,这样下来就是一个形象的树形结构

接下来看两个小案例,求最大公约数

# 定义函数
# m 为上一次的除数,n为两个数的余数
def gcd(m, n):
    if n == 0:
        return m  # 如果余数等于0,那么上一次就是它们之间最大的除数也就是最大公约数
    print(n, m%n)  # 打印过程
    return gcd(n, m%n)  # 如果还有余数,那么就让上一次的余数作为除数,直至余数为0

gcd(3139, 2117)

反向输出字符串

def strp(s, lenth): # 给出字符串的长度
    if lenth == 0:
        return
    print(s[lenth - 1]) # 逐渐输入出最后一个
    strp(s, lenth - 1)  # 只要没输出完就继续调用

s = input("输入字符串:")
l = len(s)  # 统计输入的字符串的长度
strp(s,l)
评论 63
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杨旭华 

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值