返回顶部
首页 > 资讯 > 后端开发 > Python >day 17 - 1 递归函数
  • 740
分享到

day 17 - 1 递归函数

递归函数day 2023-01-30 22:01:06 740人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

递归函数 什么是递归   了解什么是递归 : 在函数中调用自身函数  最大递归深度默认是 997/998 —— 是 python 从内存角度出发做得限制  能看懂递归  能知道递归的应用场景  初识递归 —— 二分法的例子  算法 ——

递归函数

什么是递归

  了解什么是递归 : 在函数中调用自身函数
  最大递归深度默认是 997/998 —— 是 python 从内存角度出发做得限制
  能看懂递归
  能知道递归的应用场景
  初识递归 —— 二分法的例子
  算法 —— 二分查找算法
  三级菜单 —— 递归实现

我们先来看一个简单的递归函数

#可以执行下,看下与递归函数执行的结果有什么不同
while True:
    print('从前有座山')

#一个简单的递归函数
def story():
    print('从前有座山')
    story()
    print(111)  #执行不到这句话

story()


#RecursionError: maximum recursion depth exceeded while calling a Python object
# 递归的错误,超过了递归的最大深度

 

测试递归函数的深度

#测试以下 python 中的递归深度  默认 997

#修改递归限制
import sys
sys.setrecursionlimit(100000)  #不要改

n=0
def rec():
    global n
    print('从前有座山')
    n +=1
    print(n)
    rec()
rec()

# 如果递归次数太多,那么就不适合使用递归来解决问题
# 递归的缺点 : 占内存
# 递归的优点:  会让代码变简单

 

递归的逻辑

当你想解决一个问题时,需要知道另一个问题的答案
且下一个问题和前面的问题处理方法一致
递归是自上往下解决问题的

好比这样的问题

张三 多大       n = 1   age(1) = age(2)+2 = age(n+1) + 2
张三 比 李四 大两岁
李四 多大?      n = 2   age(2) = age(3) + 2 = age(n+1) +2
李四 比 王五 大两岁
王五 多大       n = 3   age(3) = age(4) + 2 = age(n+1) +2
王五 比 赵六 大两岁
赵六 多大?
赵六 40 了      n = 4   age(4) = 40

 

我们把上面的逻辑写一个递归函数

def age(n):
    if n == 4:
        return 40
    elif n >0 and n < 4:
        return age(n+1) + 2
print(age(1))  #输出结果 46

这个 46 是怎么产生的呢?我们下面来看

def age(1):
    if 1 == 4:
        return 40
    elif 1 > 0 and 1 < 4:
        return 46  #于是最终得到 46 的结果

def age(2):
    if 2 == 4:
        return 40
    elif 2 >0 and 2 < 4:
        return age(3) + 2    # age(3) 的返回结果加 2 得到 44,返回给 age(1)

def age(3):
    if 3 == 4:
        return 40
    elif 3 >0 and 3 < 4:
        return  age(n+1) + 2   #4、age(4) + 2 得到 42 返回给age(2)

def age(4):
    if 4 == 4:        #2、发现下面判断不在满足条件
        return 40    #3、于是返回 return 40,注意:这里返回给了调用着 age(3)
    elif n >0 and n < 4:
        return  age(n+1) + 2        #1、这里 age(3+1) 得到 age(4) ,再次调用

 

小结:

超过最大递归限制的报错
只要写递归函数,必须要有结束条件。

返回值
1、不要只看到return就认为已经返回了。要看返回操作是在递归到第几层的时候发生的,然后返回给了谁。
2、如果不是返回给最外层函数,调用者就接收不到。
3、需要再分析,看如何把结果返回回来。

二分查找算法

什么叫算法
计算的方法 : 人脑复杂 计算机简单

我们现在学习的算法 都是过去时
  了解基础的算法 才能创造出更好的算法
  不是所有的事情都能套用现成的方法解决的
  有些时候会用到学过的算法知识来解决新的问题

二分查找算法 必须处理有序的列表
k = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]

基础版,列表的 k 的下标乱了

k = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]
def find(lis,aim):
    #获取中间值
    mid = len(lis)//2
    #如果中间值大于 aim
    if lis[mid] > aim:
        new_lis = lis[:mid]
        find(new_lis,aim)
    elif lis[mid] < aim:
        new_lis = lis[mid + 1:]
        find(new_lis,aim)
    else:
        print('找到了:'+ str(aim) + ' 所在位置为:'+ str(mid))

find(k,66)

 

升级版,解决了下标问题

k = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]
def find(lis,aim,start = 0,end = len(k)):
    #获取中间值
    mid = (end - start)//2 + start
    #如果中间值大于 aim
    if lis[mid] > aim:
        find(lis,aim,start = start,end = mid-1)
    elif lis[mid] < aim:
        find(lis,aim,start = mid + 1,end = end)
    else:
        print('找到了:'+ str(aim) + ' 所在位置为:',mid)

find(k,18)
find(k,43)

 

继续升级
end 的问题
我们不希望每次找一个列表的都要修改函数中额 len(k) 这样函数就没有了可用性

k = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]
def find(lis,aim,start = 0,end = None):
    end = len(lis) if end is None else end
    #获取中间值
    mid = (end - start) // 2 + start
    #中间值大于 aim
    if lis[mid] > aim:
        find(lis,aim,start = 0,end = mid - 1)
    elif lis[mid]< aim:
        find(lis,aim,start= mid + 1,end = end)
    else:
        print('找到了:'+str(aim)+"位于"+str(mid))
find(k,69)

 

接着升级
找不到所要查找的值怎么处理

k = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]
def find(lis,aim,start = 0,end = None):
    end = len(lis) if end is None else end
    #获取中间值
    mid = (end - start) // 2 + start
    if start <= end:
        #中间值大于 aim
        if lis[mid] > aim:
            find(lis,aim,start = 0,end = mid - 1)
        elif lis[mid]< aim:
            find(lis,aim,start= mid+1,end = end)
        else:
            print('找到了:'+str(aim)+"位于"+str(mid))
    else:
        print('找不到这个值')
find(k,68)

 

最后返回值的问题,因为我们希望最后的结果只是一个我们想要的值

k = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]
def find(lis,aim,start = 0,end = None):
    end = len(lis) if end is None else end
    #获取中间值
    mid = (end - start) // 2 + start
    if start <= end:
        #中间值大于 aim
        if lis[mid] > aim:
           return find(lis,aim,start = 0,end = mid - 1)
        elif lis[mid]< aim:
           return find(lis,aim,start= mid+1,end = end)
        else:
           # print('找到了:'+str(aim)+"位于"+str(mid))
           return mid
    else:
        return'找不到这个值'

print(find(k,5))

 

为了更加了解递归函数和上面的二分查找法可以拆开上面的函数分析下面的三种方法

# 67  发生两次调用
# 66  发生好几次
# 44  找不到

 

--结束END--

本文标题: day 17 - 1 递归函数

本文链接: https://lsjlt.com/news/180409.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • day 17 - 1 递归函数
    递归函数 什么是递归   了解什么是递归 : 在函数中调用自身函数  最大递归深度默认是 997/998 —— 是 python 从内存角度出发做得限制  能看懂递归  能知道递归的应用场景  初识递归 —— 二分法的例子  算法 —— ...
    99+
    2023-01-30
    递归 函数 day
  • day 15 - 1 内置函数
    内置函数 作用域相关 locals() globals() #这两组开始容易搞混 print(locals()) #返回本地作用域中的所有名字 print(globals()) #返回全局作用域中的所有名字 # global 变量...
    99+
    2023-01-30
    函数 day
  • 函数递归
    如果一个函数在内部调用自身本身,则该函数就是递归函数 递归优缺点   优点:使用递归函数的优点是逻辑简单清晰      理论上,所有的递归函数都可以写成循环的方式,但循环的逻辑不如递归清晰   缺点:过深的调用会导致栈溢出...
    99+
    2023-01-31
    递归 函数
  • python_函数递归
    函数递归 函数递归:函数的递归调用,即在函数调用的过程中,又直接或间接地调用了函数本身 # import sys # print(sys.getrecursionlimit()) # sys.setrecursionlimit(1000...
    99+
    2023-01-30
    递归 函数
  • Python递归函数
    参考: https://pythonspot.com/recursion/ https://www.python-course.eu/recursive_functions.php 一、递归函数两大要素 -- 终止条件和递归方程 1、递归...
    99+
    2023-01-30
    递归 函数 Python
  • C++ 函数递归详解:尾递归优化
    递归定义及优化:递归:函数内部调用自身,解决可分解为更小子问题的难题。尾递归:函数进行所有计算后才进行递归调用,可优化为循环。尾递归优化条件:递归调用为最后操作。递归调用参数与原始调用参...
    99+
    2024-05-03
    c++ 递归
  • C++ 函数递归详解:递归优化技巧
    函数递归是函数自身调用自身,通过分解问题为子问题提供解决复杂问题的有效方法。优化递归至关重要,以避免堆栈溢出。常见优化技巧包括:限制递归深度使用尾递归优化使用备忘录避免重复计算 C++...
    99+
    2024-05-03
    c++ 递归 堆栈溢出
  • python递归函数详解
    递归函数是指在函数定义中使用函数自身的一种编程技巧。递归函数通常包括两个部分:基本情况和递归情况,基本情况是指函数的结束条件,递归情况是指函数调用自身的情况。递归函数的特点:1、更容易理解和编写,尤其是对于一些问题,如树的遍历、阶乘计算、斐...
    99+
    2023-12-18
    python 递归函数
  • C++ 函数递归详解:递归的替代方法
    递归是一种函数调用自身的技术,但存在堆栈溢出和效率低下的缺点。替代方法包括:尾递归优化,由编译器优化递归调用为循环;迭代,使用循环而不是递归;协程,允许暂停和恢复执行,模拟递归行为。 ...
    99+
    2024-05-01
    c++ 递归 堆栈溢出
  • C++ 函数递归详解:回溯法中的递归
    c++++ 函数递归详解:递归是函数调用自身的一种技术,在回溯法等算法中很有用。回溯法是通过系统地尝试所有解决方案并回溯到死胡同时来解决问题的。数独求解是递归函数在回溯法中实际应用的例子...
    99+
    2024-05-03
    c++ 回溯法 函数递归
  • C++ 函数的递归实现:递归与非递归算法的比较分析?
    递归算法通过函数自调用解决结构化的问题,优点是简洁易懂,缺点是效率较低且可能发生堆栈溢出;非递归算法通过显式管理堆栈数据结构避免递归,优点是效率更高且避免堆栈溢出,缺点是代码可能更复杂。...
    99+
    2024-04-22
    c++ 递归 堆栈溢出
  • C++ 函数递归详解:递归的定义和原理
    递归是一种函数调用自我的编程技术,通过将问题分解成较小问题、设置边界条件和递减问题来实现。以求斐波那契数列为例,递归函数使用边界条件(n ≤ 1)和递减问题(fib(n - 1) + f...
    99+
    2024-05-01
    函数 递归 c++
  • C++ 函数递归详解:动态规划中的递归
    摘要:递归调用在 c++++ 中通过调用自身的函数实现。斐波那契数列的递归求解需要三个组成部分:基础条件(n 小于等于 1)、递归调用(自身求解 f(n-1) 和 f(n-2))、递增/...
    99+
    2024-05-03
    c++ 递归
  • C++ 函数递归详解:递归的复杂度分析
    递归是一种函数调用自身的过程。递归的时间复杂度可以通过计算递归调用次数来分析,例如阶乘函数为 o(n^2),斐波那契数列第 n 项的递归函数为 o(φ^n),其中 φ 是黄金比。 C+...
    99+
    2024-05-04
    c++ 函数递归
  • C++ 函数递归详解:递归求解组合问题
    递归是一种用于解决组合问题的函数调用自身的方法。算法步骤包括基线条件(当需要选择的元素数量为 0 时返回空集合)和递归步骤(枚举所有可能的组合,并附加当前元素)。实战案例中,使用递归函数...
    99+
    2024-05-01
    c++ 递归
  • C++ 函数递归详解:递归遍历树形结构
    递归函数可以用于遍历树形结构,其基本原理是函数不断调用自身并传入不同的参数值,直到基本情况终止递归。在实战案例中,用于遍历二叉树的递归函数遵循以下流程:若当前节点为空,则返回;递归遍历左...
    99+
    2024-05-04
    c++ 函数递归 堆栈溢出
  • php递归函数是什么
    这篇文章将为大家详细讲解有关php递归函数是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。递归就是一个函数在它的函数体内调用它自身。执行递归函数将反复调用其自身,每调用一次就进入新的一层。递归函数必须...
    99+
    2023-06-14
  • python 递归与高阶函数
    在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。一个简单的递归函数(不正式)def calc(n):     print(n)   &...
    99+
    2023-01-30
    递归 高阶 函数
  • python3学习之递归函数
    ##递归函数 #自己调用自己 def t(a):     if a == 1:         return 1     return a + t(a-1) b = t(7) print(b) #计算1+2+3+4+5+6+7 的和...
    99+
    2023-01-31
    递归 函数
  • python基础之递归函数
    # 递归满足的条件 # 1.自己调用自己 # 2.必须有一个明确的结束条件 # 优点:逻辑简单\定义简单 # 缺点:防止内存消耗过多,容易导致栈溢出,内存资源紧张,甚至内存泄漏...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作