递归——简单粗暴的问题解决方式

2024-01-11 19:04

本文主要是介绍递归——简单粗暴的问题解决方式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

相信很多人在刚接触算法时都在递归上栽过跟头(包括我),但是在掌握了这项技能后会有种豁然开朗的感觉!
我用我自己!
怎么会有这么优雅而又简单粗暴的解决问题的方法! \color{red}{怎么会有这么优雅而又简单粗暴的解决问题的方法!} 怎么会有这么优雅而又简单粗暴的解决问题的方法!

1 定义

没错,递归解决问题的思路就是“我用我自己”。
官方一点的解释是:递归(recursion)是一种在函数定义中使用函数自身的编程技术。在递归中,一个问题被分解为一个或多个更小的子问题,这些子问题与原始问题具有相同的结构。通过解决这些子问题,最终可以解决原始问题。

2 例子

沿用“二分查找”的例子,在原本的二分查找中,我们使用的是while循环的方法解决问题:

def binary_search_loop(an, item):low = 0high = len(an)-1while low <= high:mid = int((low + high)/2)guess = an[mid]if guess == item:return mid+1if guess > item:high = mid - 1else:low = mid + 1pass

但是在一些编程语言中并没有类似于while的循环,这时递归便可派上用场:

def binary_search_recursion(an, item, high, low):mid = int((low + high)/2)guess = an[mid]if guess == item:return mid + 1elif guess > item:return binary_search_recursion(an, item, mid-1, low)else:return binary_search_recursion(an, item, high, mid+1)

在进行递归时,需要进行递归条件基线条件的判别。

2.1 基线条件

正如前文所述,递归是将一个问题被分解为一个或多个更小的子问题的过程,这是编程中极为重要的思想——分而治之(divide and conquer,D&C)。而基线条件对应的就是“最小的问题”,小到不可分。

...
if guess == item:return mid + 1
...

在代码中,当guess == item时,说明已经“猜”中了需要查找的元素,问题已经得到解决,而这个条件就是基线条件。

2.2 递归条件

...elif guess > item:return binary_search_recursion(an, item, mid-1, low)else:return binary_search_recursion(an, item, high, mid+1)
...

递归条件对应的是问题在没被解决时对应的条件,在例子中guess > item以及guess < item对应的都是问题还可拆分的情况,只不过后者被else所取代了。

这篇关于递归——简单粗暴的问题解决方式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/595392

相关文章

IDEA编译报错“java: 常量字符串过长”的原因及解决方法

《IDEA编译报错“java:常量字符串过长”的原因及解决方法》今天在开发过程中,由于尝试将一个文件的Base64字符串设置为常量,结果导致IDEA编译的时候出现了如下报错java:常量字符串过长,... 目录一、问题描述二、问题原因2.1 理论角度2.2 源码角度三、解决方案解决方案①:StringBui

Debezium 与 Apache Kafka 的集成方式步骤详解

《Debezium与ApacheKafka的集成方式步骤详解》本文详细介绍了如何将Debezium与ApacheKafka集成,包括集成概述、步骤、注意事项等,通过KafkaConnect,D... 目录一、集成概述二、集成步骤1. 准备 Kafka 环境2. 配置 Kafka Connect3. 安装 D

mybatis和mybatis-plus设置值为null不起作用问题及解决

《mybatis和mybatis-plus设置值为null不起作用问题及解决》Mybatis-Plus的FieldStrategy主要用于控制新增、更新和查询时对空值的处理策略,通过配置不同的策略类型... 目录MyBATis-plusFieldStrategy作用FieldStrategy类型每种策略的作

C++初始化数组的几种常见方法(简单易懂)

《C++初始化数组的几种常见方法(简单易懂)》本文介绍了C++中数组的初始化方法,包括一维数组和二维数组的初始化,以及用new动态初始化数组,在C++11及以上版本中,还提供了使用std::array... 目录1、初始化一维数组1.1、使用列表初始化(推荐方式)1.2、初始化部分列表1.3、使用std::

linux下多个硬盘划分到同一挂载点问题

《linux下多个硬盘划分到同一挂载点问题》在Linux系统中,将多个硬盘划分到同一挂载点需要通过逻辑卷管理(LVM)来实现,首先,需要将物理存储设备(如硬盘分区)创建为物理卷,然后,将这些物理卷组成... 目录linux下多个硬盘划分到同一挂载点需要明确的几个概念硬盘插上默认的是非lvm总结Linux下多

Springboot中分析SQL性能的两种方式详解

《Springboot中分析SQL性能的两种方式详解》文章介绍了SQL性能分析的两种方式:MyBatis-Plus性能分析插件和p6spy框架,MyBatis-Plus插件配置简单,适用于开发和测试环... 目录SQL性能分析的两种方式:功能介绍实现方式:实现步骤:SQL性能分析的两种方式:功能介绍记录

Python Jupyter Notebook导包报错问题及解决

《PythonJupyterNotebook导包报错问题及解决》在conda环境中安装包后,JupyterNotebook导入时出现ImportError,可能是由于包版本不对应或版本太高,解决方... 目录问题解决方法重新安装Jupyter NoteBook 更改Kernel总结问题在conda上安装了

pip install jupyterlab失败的原因问题及探索

《pipinstalljupyterlab失败的原因问题及探索》在学习Yolo模型时,尝试安装JupyterLab但遇到错误,错误提示缺少Rust和Cargo编译环境,因为pywinpty包需要它... 目录背景问题解决方案总结背景最近在学习Yolo模型,然后其中要下载jupyter(有点LSVmu像一个

Goland debug失效详细解决步骤(合集)

《Golanddebug失效详细解决步骤(合集)》今天用Goland开发时,打断点,以debug方式运行,发现程序并没有断住,程序跳过了断点,直接运行结束,网上搜寻了大量文章,最后得以解决,特此在这... 目录Bug:Goland debug失效详细解决步骤【合集】情况一:Go或Goland架构不对情况二:

SQL 中多表查询的常见连接方式详解

《SQL中多表查询的常见连接方式详解》本文介绍SQL中多表查询的常见连接方式,包括内连接(INNERJOIN)、左连接(LEFTJOIN)、右连接(RIGHTJOIN)、全外连接(FULLOUTER... 目录一、连接类型图表(ASCII 形式)二、前置代码(创建示例表)三、连接方式代码示例1. 内连接(I