【算法】递归算法理解(持续更新)

这里写目录标题

  • 一、递归算法
    • 1、什么情况下可以使用递归?
    • 2、递归算法组成部分
    • 3、案例:求n的阶乘
    • 4、编写一个递归函数来计算列表包含的元素数。
    • 5、通过递归找到列表中最大的数字。
    • 6、通过递归的方式实现二分查找算法。

在这里插入图片描述

一、递归算法

递归(Recursion)是一种解决问题的思路,其精髓在于将问题分解为规模更小的相同问题,持续分解,直到问题规模小到可以用非常简单直接的方式来解决。递归的问题分解方式非常独特,其算法方面的明显特征就是:在算法流程中调用自身。

在调试递归算法程序的时候经常会碰到这样的错误:RecursionError: maximum recursion depth exceeded in comparison,原因递归的层数太多,但系统调用栈容量是有限的。

递归示意图如下:求1到10内的奇数和
在这里插入图片描述

1、什么情况下可以使用递归?

1个问题可以拆分为多个子问题
这些问题求解思路相同,数据规模不同
拥有明确的的终止条件

2、递归算法组成部分

基准条件(递归结束条件)
递归条件
如何分解问题,最终能让递归终止

3、案例:求n的阶乘

基准条件为(结束条件):函数不在调用自己
递归条件:函数调用自己
如何分解问题:让n在每次执行完之后,都减小

def factorial(n):# 基线条件(结束条件):函数不再调用自己if n == 1:return 1# 递归条件:函数调用自己# 让n在每次执行完之后,都变小res = n * factorial(n - 1)return resprint(factorial(4))

4、编写一个递归函数来计算列表包含的元素数。

基线条件:当列表不为空列表时一直删除,删除到空就停止
递归条件,一直传递被修改的列表,以及最后的累加和的变量
问题如何分解:每累加一个元素,就把这个元素在列表里面去掉

nums=[1,2,3,4]
def list_sum(nums,sum_data=0):#基线条件:当列表为空列表一直删除,删除到空就停止if len(nums)==0:return sum_data# 递归条件,一直传递被修改的列表,以及最后的累加和的变量# 递归条件,问题如何分解:每累加一个元素,就把这个元素在列表里面去掉pop_data=nums.pop()sum_data=sum_data+pop_datareturn list_sum(nums,sum_data)nums=[1,2,3,4]
print(list_sum(nums))

5、通过递归找到列表中最大的数字。

基线条件:当列表不为空列表时,一直删除,删除到空停止
递归条件,一直传递修被修改的列表,以及最大值的变量
问题如何分解:每比对一个元素,就把这个元素在列表中删除

def list_max(nums,max_value=0):# 基线条件:当列表为空列表,一直删除,删除到空停止if len(nums)==0:return max_value# 递归条件,一直传递修被修改的列表,以及最大值的变量# 递归条件,问题如何分解:每比对一个元素,就把这个元素在列表中删除pop_data=nums.pop()max_value=max(max_value,pop_data)return list_max(nums,max_value)nums=[1,5,3,4]
print(list_max(nums))

6、通过递归的方式实现二分查找算法。

在这里插入图片描述

基线条件:当nums[mid]==target时停止;或者当left<=right时停止;
递归条件,一直更新左右指针,并且满足left<=right时
问题如何分解:每次计算mid=(left+right)//2的值后,对nums[mid]与target进行对比,来改变左或者右指针。

二分查找是一种在有序数组中查找元素的算法;将数组分成两部分,判断目标元素可能在哪一部分;直到找到元素或者确定目标元素不存在于数组中。
思路:
1、确定查找范围
2、获取中间元素
3、如果数字小了,就修改最小值
4、如法数字大了,就修改最大值
5、如果猜中了,则返回下标
6、重复以上的过程指导找到目标元素或者u其额定目标元素不存在于数组中

def digui_search(nums,left,right,target):while left<=right:mid=(left+right)//2if nums[mid]==target:return midelif nums[mid]>target:right=mid-1digui_search(nums,left,right,target)else:left=mid+1digui_search(nums,left,right,target)return -1
nums=[1,3,5,7,9]
target=2
print(digui_search(nums,0,4,target))

不采用递归的方法,进行二分查找

def binary_search(nums, target):# 第一个下标low = 0# 最后一个下标high = len(nums) - 1# 只要最小值一直小于最大值,那么就一直循环查找while low <= high:# 获取中间值的下标值,向下整除mid = (low + high) // 2if nums[mid] == target:return mid# 如果中间值小于目标值,修改最小值elif nums[mid] < target:low = mid + 1# 如果中间值大于目标值,修改最大值else:high = mid - 1# 重复以上的过程指导找到目标元素或者u其额定目标元素不存在于数组中return -1

在这里插入图片描述


在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/322256.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网页在线预览编辑Office,支持doc/docx、xls/xlsx、ppt/pptx、pdf等格式

随着互联网技术的不断发展&#xff0c;越来越多的企业开始采用在线办公模式&#xff0c;微软Office Word 是最好用的文档编辑工具&#xff0c;然而doc、docx、xls、xlsx、ppt、pptx等格式的Office文档是无法直接在浏览器中直接打开的&#xff0c;如果可以实现Web在线预览编辑Of…

普中STM32-PZ6806L开发板(HAL库函数实现-温度传感器DS18B20)

简介 主芯片STM32F103ZET6, 通过引脚PG11 连接DS18B20, 读取DS18B20采集的温度数据;电路原理图 DS18B20电路图 DS18B20 与 主芯片连接引脚 其他知识 DS18B20资料 DS18B20数据手册 DS18B20 简介 单线通讯的温度传感器, 测量温度在-55℃ 到 125℃&#xff0c; 在-10C 到…

深耕汽车检测设备领域,引领行业技术革新

在汽车工业飞速发展的今天&#xff0c;汽车检测技术作为保障车辆安全、提升维修效率的重要手段&#xff0c;日益受到行业内外的高度关注。康士柏汽车检测线设备厂家&#xff0c;作为这一领域的佼佼者&#xff0c;凭借其深厚的技术积累和卓越的产品品质&#xff0c;正引领着行业…

rollup 插件输出生成钩子

✨专栏介绍 Rollup专栏是一个专门介绍Rollup打包工具的系列文章。Rollup是一个现代化的JavaScript模块打包工具&#xff0c;它可以将多个模块打包成一个或多个文件&#xff0c;以提高应用程序的性能和加载速度。 在Rollup专栏中&#xff0c;您将学习到如何安装和配置Rollup&a…

提示循环引用 一个循环引用但无法列出导致循环的引用且文件打不开无法修改

目录 设备环境&#xff1a; 提示内容&#xff1a; 具体错误问题描述&#xff1a; 图示&#xff1a; Office 报错 WPS 报错 问题分析&#xff1a; 问题解决&#xff1a; 关注我的 GitHub&#xff08;魔法网络访问&#xff09;&#xff1a; 设备环境&#xff1a; Window…

优雅实现微信小程序动态tabBar,根据不同用户角色显示不同底部导航——更新版(支持自由组合总数超过5个tabBar菜单)

背景 在开发小程序过程中&#xff0c;有个需求是&#xff0c;小程序底部的tabBar需要根据不同用户角色显示不同底部导航。此时就需要用到自定义底部导航 custom-tab-bar。 上次发文是组合显示4个底部tabBar导航&#xff0c;很多小伙伴评论说组合超过5个怎么办。他们的需求总数…

【Nodejs】基于node http模块的博客demo代码实现

目录 package.json www.js db.js app.js routes/blog.js controllers/blog.js mysql.js responseModel.js 无开发&#xff0c;不安全。 这个demo项目实现了用Promise异步处理http的GET和POST请求&#xff0c;通过mysql的api实现了博客增删改查功能&#xff0c;但因没有…

Python 简单爬虫程序及其工作原理

前言 网络中包含大量的数据&#xff0c;这些数据对于我们来说是非常有价值的&#xff0c;因此编写一个爬虫程序&#xff0c;自动从网页中获取所需的数据&#xff0c;对于信息收集和分析是非常有帮助的。Python 是一种高效而灵活的编程语言&#xff0c;它提供了强大的库和框架来…

istio 限流:本地限流+全局限流

istio 限流在官网的位置是 任务->策略执行->使用 Envoy 启用速率限制 istio 限流基于数据面 Envoy 开发&#xff0c;Envoy 支持两个类型限流&#xff0c;分别是本地限流和全局限流&#xff08;本地限流和全局限流可以一起使用&#xff09; 开始之前 安装 istio部署 boo…

【面试高频算法解析】算法练习3 双指针

前言 本专栏旨在通过分类学习算法&#xff0c;使您能够牢固掌握不同算法的理论要点。通过策略性地练习精选的经典题目&#xff0c;帮助您深度理解每种算法&#xff0c;避免出现刷了很多算法题&#xff0c;还是一知半解的状态 专栏导航 二分查找回溯双指针滑动窗口深度优先搜索…

八、QLayout 用户基本资料修改(Qt5 GUI系列)

目录 一、设计需求 二、实现代码 三、代码解析 四、总结 一、设计需求 在很多应用程序中会有用户注册或用户编辑信息等界面。本文就设计一个用户信息编辑界面。要求包含用户名、姓名、性别、部门、年龄、头像、个人说明等信息。 二、实现代码 #ifndef DIALOG_H #define D…

STM32和ESP8266的WiFi模块控制与数据传输

基于STM32和ESP8266 WiFi模块的控制与数据传输是一种常见的嵌入式系统应用。在这种应用中&#xff0c;STM32作为主控制器负责控制和与外部传感器交互&#xff0c;而ESP8266 WiFi模块则用于实现无线通信和数据传输。本文将介绍如何在STM32上控制ESP8266模块&#xff0c;建立WiFi…