递归算法解读

递归(Recursion)是计算机科学中的一个重要概念,它指的是一个函数(或过程)在其定义中直接或间接地调用自身。递归函数通过把问题分解为更小的相似子问题来解决原问题,这些更小的子问题也使用相同的解决方案,但处理的数据规模更小。递归通常有两个关键部分:递归基准情形(base case)和递归步骤(recursive step)。

递归基准情形:是递归函数不再调用自身的情况,即问题规模缩小到可以直接解决的程度。这是递归终止的条件,确保递归过程不会无限进行下去。

递归步骤:是将问题分解为更小的子问题,并调用自身来解决这些子问题的步骤。递归步骤必须逐步缩小问题的规模,最终到达递归基准情形。

递归在解决许多问题时非常有用,如排序、搜索、遍历数据结构(如树和图)以及解决数学问题等。然而,递归也需要注意一些问题,如栈溢出(由于递归调用太深而耗尽系统栈空间)和效率问题(某些递归算法可能不如迭代算法高效)。
递归的两个特定

  • 调用自身
  • 结束条件
# 不是合法的递归
def func1(x):print(x)func1(x-1)# 不是合法的递归
def func2(x):if x>0:print(x)func2(x+1)# 是一个合法的递归
def func3():if x>0:print(x)func3(x-1)
# 4,3,2,1# 是一个合法的递归
def func4():if x>0:func4(x-1)print(x)
# 1,2,3,4

递归的示例1: 汉诺塔问题

汉诺塔问题是一个经典的问题。汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,任何时候,在小圆盘上都不能放大圆盘,且在三根柱子之间一次只能移动一个圆盘。问应该如何操作?
![外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传]
在这里插入图片描述
在这里插入图片描述
只有三个圆盘的时候需要这几步

  1. 将1从A移动到C,2从A移动到B,然后再1从C移动到B如图b所示
  2. 将3从A移动到C,如图c所示
  3. 将1从B移动到A,将2从B移动到C,再将1从A移动到C如图d所示。

单有n个圆盘时:

  1. 把n-1个圆盘从A经过C移动到B
  2. 把第n个圆盘从A移动到C
  3. 把n-1个圆盘从B经过A移动到C
    在这里插入图片描述
    初始位置
    在这里插入图片描述

第一步把n-1个盘子从A移动到B
在这里插入图片描述
第二步把第n个盘中从A移动到C
在这里插入图片描述
第三步把n-1个盘子从B移动到C

解题思路,把n-1个盘子当成一个整体,把问题转化为二个圆盘,移动两个圆盘无非是上面三步,将n-1个圆盘移动好了之后加上三步就是总的移动,这样就把n个圆盘的问题转化为n-1的圆盘的问题。

step = 0def hanoi(n, source, target, auxiliary):"""n:要移动的盘子数量。A:源柱子,即开始时的柱子。C:目标柱子,即要将盘子移动到的柱子。B:辅助柱子,用于在移动过程中暂存盘子。"""if n > 0:# 将n-1个盘子从源柱子移动到B柱子,目标柱子作为中转hanoi(n - 1, source, auxiliary, target)# 打印移动盘子global stepstep += 1print(f'Move disk {n} from {source} to {target}')# 将n-1个盘子从辅助柱子移动到目标柱子,源柱子作为中转hanoi(n - 1, auxiliary, target, source)# 调用函数,移动3个盘子从柱子A到柱子C,使用柱子B作为辅助
hanoi(2, 'A', 'C', 'B')
print("总的移动步数:", step)

递归的示例2: 斐波那契数列

斐波那契数列就是由0和1开始,之后的斐波那契数就是由之前的两数相加而得出。比如说在斐波拉契数列当中第一个数为0,第二个数为1,因此第三个数为前面两个数之和,因此第三个数为1,同理第四个数是第二个数和第三个数之和,因此第四个数为2,下面就是斐波拉契数的变化:
F 0 = 0 F 1 = 1 F 3 = F 0 + F 1 F n = F n − 2 + F n − 1 F_0 = 0\\ F_1 = 1\\ F_3 = F_0 + F_1\\ F_n = F_n-_2 + F_n-_1 F0=0F1=1F3=F0+F1Fn=Fn2+Fn1
在这里插入图片描述

def fibonacci_recursive(n):if n <= 0:return "输入错误,请输入一个正整数"elif n == 1:return 0elif n == 2:return 1else:return fibonacci_recursive(n - 1) + fibonacci_recursive(n - 2)# 测试函数print(fibonacci_recursive(10))  # 输出:55

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

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

相关文章

ClickHouse笔记

1. 简介 开发背景: ClickHouse 由 Yandex 于 2016 年开源&#xff0c;目的是提供高性能的 OLAP 解决方案。性能: ClickHouse 能够以极高的速度处理大量数据&#xff0c;每秒可以处理数亿到十亿多行数据。架构: 它使用 C 编写&#xff0c;提供丰富的数据类型、数据库引擎和表引…

深度学习方法;乳腺癌分类

乳腺癌的类型很多&#xff0c;但大多数常见的是浸润性导管癌、导管原位癌和浸润性小叶癌。浸润性导管癌(IDC)是最常见的乳腺癌类型。这些都是恶性肿瘤的亚型。大约80%的乳腺癌是浸润性导管癌(IDC)&#xff0c;它起源于乳腺的乳管。 浸润性是指癌症已经“侵袭”或扩散到周围的乳…

SSM 项目学习(Vue3+ElementPlus+Axios+SSM)

文章目录 1 项目介绍1.1 项目功能/界面 2 项目基础环境搭建2.1 创建项目2.2 项目全局配置 web.xml2.3 SpringMVC 配置2.4 配置 Spring 和 MyBatis , 并完成整合2.5 创建表&#xff0c;使用逆向工程生成 Bean、XxxMapper 和 XxxMapper.xml2.6 注意事项和细节说明 3 实现功能 01-…

redis进阶入门主从复制与哨兵集群

一、主从复制 1.1背景 一般来说&#xff0c;要将 Redis用于工程项目中&#xff0c;只使用一台 Redist是万万不能的&#xff0c;原因如下&#xff1a; 从结构上&#xff0c;单个 Redist服务器会发生单点故障&#xff0c;井且一台服务器需要处理所有的请求负載&#xff0c;压力…

软件测试(测试用例详解)(三)

1. 测试用例的概念 测试用例&#xff08;Test Case&#xff09;是为了实施测试而向被测试的系统提供的一组集合。 测试环境操作步骤测试数据预取结果 测试用例的评价标准&#xff1a; 用例表达清楚&#xff0c;无二义性。。用例可操作性强。用例的输入与输出明确。一条用例只有…

数据库性能优化入门:数据库分片初探

数据库分片是一种用于提升数据库性能的架构模式&#xff0c;选择正确的分片策略和实施方式对于提高数据库性能和应对大规模数据挑战至关重要。 本文介绍了数据库分片的定义、原理和实施方法。文章解释了数据库分片是如何通过将数据切分、分散存储在多个服务器上来提升性能&…

Linux-程序地址空间

目录 1. 程序地址空间分布 2. 两个问题 3. 虚拟地址和物理地址 4. 页表 5. 解决问题 6. 为什么要有地址空间 1. 程序地址空间分布 测试一下&#xff1a; #include<stdio.h> #include<stdlib.h> #include<unistd.h> #include<sys/types.h>int ga…

计算机服务器中了halo勒索病毒怎么办,halo勒索病毒解密流程步骤

随着网络技术的不断应用&#xff0c;企业的生产运营得到了快速发展&#xff0c;越来越多的企业开始利用服务器数据库存储企业的重要信息文件&#xff0c;数据库为企业的生产运营提供了极大便利&#xff0c;但网络技术的不断发展也为企业的数据安全带来严重威胁。近日&#xff0…

全栈的自我修养 ———— react中router入门+路由懒加载

router 下载router配置view创建目录配置index.js 下载router npm install react-router-dom配置view 如下将组件倒出 const Login () > {return <div>这是登陆</div> } export default Login创建目录 配置index.js React.lazy有路由懒加载的功能&#xff0…

redis进阶入门配置与持久化

一、Redis.conf详解 容量单位 1、配置大小单位&#xff0c;开头定义了一些基本的度量单位&#xff0c;只支持bytes&#xff0c;不支持bit,不区分大小写&#xff0c;G和GB有区别 2、对 大小写 不敏感 可以使用 include 组合多个配置问题 网络配置 bind 127.0.0.1 # 绑定的i…

递归算法讲解2

前情提要 上一篇递归算法讲解在这里 递归算法讲解&#xff08;结合内存图&#xff09; 没看过的小伙伴可以进去瞅一眼&#xff0c;谢谢&#xff01; 递归算法的重要性 递归算法是非常重要的&#xff0c;如果想要进大厂&#xff0c;以递归算法为基础的动态规划是必考的&…

【React】基于JS 3D引擎库实现关系图(图graph)

主角&#xff1a;3D Force-Directed Graph 简介&#xff1a;一个使用ThreeJS/WebGL进行3D渲染的Graph图库 GitHub: https://github.com/vasturiano/3d-force-graph Ps: 较为复杂或节点巨大时&#xff0c;对GPU>CPU消耗较大&#xff0c;同量级节点对比下优于AntV G6和Echarts…

RDD算子(四)、血缘关系、持久化

1. foreach 分布式遍历每一个元素&#xff0c;调用指定函数 val rdd sc.makeRDD(List(1, 2, 3, 4)) rdd.foreach(println) 结果是随机的&#xff0c;因为foreach是在每一个Executor端并发执行&#xff0c;所以顺序是不确定的。如果采集collect之后再调用foreach打印&#xf…

51之定时器与中断系统

目录 1.定时器与中断系统简介 1.1中断系统 1.2定时器 1.2.1定时器简介 1.2.2定时器大致原理及其配置 1.2.3定时器所需的所有配置总介 2.定时器0实现LED闪烁 3.使用软件生成定时器初始化程序 1.定时器与中断系统简介 1.1中断系统 首先&#xff0c;我们需要来了解一下什么…

Vue项目中引入html页面(vue.js中引入echarts数据大屏html [静态非数据传递!] )

在项目原有vue&#xff08;例如首页&#xff09;基础上引入html页面 1、存放位置 vue3原有public文件夹下 我这边是新建一个static文件夹 专门存放要用到的html文件 复制拖拽过来 index为html的首页 2、更改路径引入到vue中 这里用到的是 iframe 方法 不同于vue的 component…

python爬虫获取豆瓣前top250的标题(简单)

今天是简略的一篇&#xff0c;简单小实验 import requests from bs4 import BeautifulSoup# 模拟浏览器的构成&#xff08;请求头&#xff09; headers {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Ch…

从零开始搭建后端信息管理系统(新手小白比如)

如果你是新手小白&#xff0c;首先我们要进行一些准备工作&#xff0c;安装一些基础软件&#xff0c; 备注一下&#xff1a;这里安装的vue环境的后台管理系统&#xff0c;不同的后台管理系统&#xff0c;需要安装不同的插件 准备工作&#xff1a; 安装 Visual Studio Code …

如何使用 Midjourney?2024年最新更新

一&#xff1a;基础篇 1&#xff1a;注册 首先&#xff0c;你需要注册一个 Discord 账号&#xff0c;然后加入 Midjourney 的 Discord 服务器。或者去 Midjourney 的官网点击右下角的 Join the Beta&#xff1a; ​ 2&#xff1a;在 Discord 公共服务器里使用 注册并进入到…

Unix 网络编程, Socket 以及bind(), listen(), accept(), connect(), read()write()五大函数简介

Unix网络编程是针对类Unix操作系统&#xff08;包括Linux、BSD以及其他遵循POSIX标准的操作系统&#xff09;进行网络通信开发的技术领域。网络编程涉及创建和管理网络连接、交换数据以及处理不同层次网络协议栈上的各种网络事件。在Unix环境中&#xff0c;网络编程通常涉及到以…

kubectl explain资源文档命令

学习并使用了一段时间的kubernetes&#xff0c;发现对k8s还是了解甚少&#xff0c;于是利用上下班通勤的时间又去B站看一些大佬的视频&#xff0c;又来重学巩固一遍知识&#xff0c;并做些记录。 之前在学习使用过程中未成了解过explain这个命令&#xff0c;因为自己部署的版本…