递归算法:
通俗讲就是:自己调用自己
???什么是自己调用自己?就是如此:
# 先来定义一个小函数,并调用自己
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)