数据结构与算法(二)——递归算法

news2024/11/20 4:57:42

目录

前言

递归算法

1、什么是递归算法

2、核心理念

3、代码演示

4、问题探讨:只递不归会怎样?

5、小结

递归实例:汉诺塔问题

1、故事引入

2、移动盘子的逻辑

3、N个盘子的移动分析

4、代码实现N个盘子的移动

5、汉诺塔移动次数计算公式


前言

本文是我关于递归算法的学习记录,完成这篇博客花了大半天的时间,自认为图文结合表述的还算详细,也希望大家阅读后会感到有所帮助;

这篇博客有一些细节的地方完善的不是很好,我日后有更加清晰理解的时候会再优化这篇博客,如果读者有什么不理解的地方,欢迎评论区留言;有写的不对的地方,欢迎批评指正,希望能够完善这篇博客。

递归算法

1、什么是递归算法

定义一个函数,在函数里面调用函数,并且要有结束条件

2、核心理念

例如:从前有座山,山上有座庙,庙里有个老和尚和小和尚将故事,故事是从前有座山...

递归的核心理念就是函数调用函数,就像故事里面有故事

但是,这个故事并不算一个递归,因为故事只有递(调用自身),没有归(结束条件

3、代码演示

def f(x):
    return x + f(x-1)

print(f(3))

函数每次都会无条件的调用自己,为了解决这个问题,我们需要在函数中加入一个判断语句,以决定何时停止调用自己;

以参数大于0为停止条件:

def f(x):
    if x > 0:
        return x + f(x-1)
    else:
        return 0

程序的运行结果是:

4、问题探讨:只递不归会怎样?

def f(x):
    return x + f(x-1)

print(f(3))

运行上面只递不归的函数,程序会报错;

为什么会这样呢?

在程序运行的时候,调用函数是有代价的,会占用一片叫做栈(stack)的内存空间,调用函数时,必须要放一些数据到栈里面,当函数运行结束时,这些数据会从栈里被取出

 

但是,如果调用了很多函数,这些函数都不返回的话,栈就被塞满了(函数调用时往栈里面存数据,函数结束时从栈里面取出数据),数据没有地方放了,这种情况叫做栈溢出错误;对于程序运行而言,这是致命的错误,因此程序会被操作系统强行终止

在Python中,可以人为设置递归调用的次数(深度),尽量保证程序不会崩溃。

5、小结

  • 递归:函数自己调用自己
  • 只递不归会导致程序崩溃
  • 要在适当的时候终止递归(加if条件判断语句)

递归实例:汉诺塔问题

1、故事引入

一个印度传说。

大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上,从下往上按照大小顺序摞着64片黄金圆盘。

大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。

在小圆盘上不能放大圆盘在三根柱子之间一次只能移动一个圆盘

64根柱子移动完毕之日,就是世界毁灭之时。

2、移动盘子的逻辑

假设盘子数目为n,n=3时,如果想把A中盘子全部移到C盘上

假设三个盘子分别为小、中、大,我们需要这样移动(注意要符合移动圆盘的要求):

小->C,中->B,小->B,大->C,小->A,中->C,小->C;共计七步。

3、N个盘子的移动分析

以上述移动盘子的逻辑为例,不能推测出,移动N(N>2)个盘子时,需要下面这几步骤:

  1. 把n-1个圆盘从A经过C移动到B;
  2. 把第n个圆盘从A移动到C;
  3. 把n-1个小圆盘从B经过A移动到C。

4、代码实现N个盘子的移动

def hanoi(n,a,b,c):
    """
    n表示圆盘数
    a表示第一根柱子最上面的圆盘(圆盘的起始位置)
    b表示第二根柱子最上面的圆盘(想将所有圆盘从a移动到c需要借助的柱子)
    c表示第三根柱子最上面的圆盘(圆盘的目标位置)
    """
    if n>0:
        hanoi(n-1,a,c,b)    # 步骤一:把n-1个圆盘从A经过C移动到B;
        print("moving from %s to %s." % (a,c))    # 步骤二:把第n个圆盘从A移动到C;
        hanoi(n-1,b,a,c)    # 步骤三:把n-1个小圆盘从B经过A移动到C。



# 测试圆盘数为1、2、3时,我们的移动步骤
hanoi(1,'A','B','C')
print('------------')
hanoi(2,'A','B','C')
print('------------')
hanoi(3,'A','B','C')

我们尝试打印出圆盘数分别为1、2、3时,需要移动的步骤,控制台打印结果为:

 

 

5、汉诺塔移动次数计算公式

设圆盘数为n时,移动次数为f(n)

根据N个盘子的移动分析步骤可以得知,第一步要移动f(n-1)次,第二步要移动1次,第三步要移动f(n-1)次

所以,汉诺塔移动次数计算公式

f(n) = f(n-1) + 1 + f(n-1);

由上图打印结果可以知道,f(1)=1;f(2)=3;f(3)=7,可以带入计算公式检验一下,的确是符合的。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

文本到图像模型,如何快速生成高质量图片? #Google Muse AI

AIGC 的存在,大大提高了创作者的生产效率,目前,市面上也出现了许多快速生成图像的 AI 图像模型。近日,谷歌的 Muse AI 系统亮相,使用 AI 生成图片又多了一个选择工具!Google Muse AI 图源:Muse …

【参考答案】java基础练习:选择结构(if、switch)

if:if...else...及if嵌套 提示用户输入三个整数,判断并输出最大值、最小值 package com.qzcsbj;import java.util.Scanner;public class Test {public static void main(String[] args) {Scanner input new Scanner(System.in);System.out.print("…

【正点原子FPGA连载】第十二章U-Boot移植 摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Linux开发指南

1)实验平台:正点原子MPSoC开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id692450874670 3)全套实验源码手册视频下载地址: http://www.openedv.com/thread-340252-1-1.html 第十二章U-Boot移…

CVR预估模型ESMM

1. 概述 一般在对CVR建模的过程中,正样本选择的是在点击后有转化的样本作为正样本,负样本则是在点击后没有转化的样本作为负样本。然而,这样的建模方式存在一定的问题: Sample Selection Bias(SSB)问题&a…

ArcGIS基础实验操作100例--实验90创建点、线、面要素混合的Voronoi

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台:ArcGIS 10.6 实验数据:请访问实验1(传送门) 空间分析篇--实验90 创建点、线、面要素混合的Voronoi 目录 一、实验背景 二、实验数据 三、实验步骤 …

回收租赁商城系统功能拆解08讲-售后退款

回收租赁系统适用于物品回收、物品租赁、二手买卖交易等三大场景。 可以快速帮助企业搭建类似闲鱼回收/爱回收/爱租机/人人租等回收租赁商城。 回收租赁系统支持智能评估回收价格,后台调整最终回收价,用户同意回收后系统即刻放款,用户微信零…

使用nginx和ffmpeg搭建HLS流媒体服务器

使用nginx和ffmpeg搭建HLS流媒体服务器 文章目录使用nginx和ffmpeg搭建HLS流媒体服务器1 安装ffmpeg2 安装nginx3 nginx有关HLS参数配置ffmpeg进行HLS切片VLC播放验证最近研究HLS流媒体协议,需要临时搭建HLS服务器,这里记录下搭建的过程(操作系统&#x…

计算机制图设计教程-以全国降水处理为例

前言本博客主要是通过一幅完整数字地图的制作过程,巩固计算机制图内容,报告中涉及到了地图数字化、空间数据的存储与管理、空间数据库的建立、符号化、制图综合技术和空间分析等内容。从而锻炼自身的动手实践能力,了解一幅地图制作设计的完整…

2022年江西省首届职业院校教师数字经济职业技能比赛“信息安全”赛项竞赛任务书

2022年江西省首届职业院校教师数字经济职业技能比赛“信息安全”赛项竞赛任务书 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 A模块 A-1 登录安全加固 90分钟 200分 A-2 数据库加固 A-3 服务加固 A-4 防火墙策略 B模块 B-1 Windows操作系统渗透测试 400分 B…

云间玉兔,自出机抒,从零开始制作Web插件网页特效小兔子组件(小挂件widget),基于原生CSS/NPM

著意登楼瞻玉兔,何人张幕遮银阙?又到了一年一度的网页小挂件环节,以往我们都是集成别人开源的组件,但所谓熟读唐诗三百首,不会做诗也会吟,熟读了别人的东西,做几首打油诗也是可以的,…

数据降维-MDS 算法

数据降维-MDS 算法 文章目录数据降维-MDS 算法算法概述算法步骤算法证明代码参考算法概述 MDS的初衷是将图结构中的距离在空间的一种表示。 例如,已知几个城市的距离,但是不知道城市的坐标,那么MDS就能通过距离矩阵转换成空间坐标向量来近似…

mock的基本使用

mock的基本使用官网文档mockjs是用来模拟产生一些虚拟的数据,可以让前端在后端接口还没有开发出来时独立开发,mockjs可以拦截ajax请求,返回设定好的数据。注意:mock(模拟数据)数据需要使用到mockjs模块&…

如何用更好的创意引发卖家和消费者的共鸣?

我们知道,近年来国家的政策越来越向创新型的企业发展倾斜,因此各行各业都响应政策,做创新型高质量发展,跨境电商作为疫情下应运而生的产物,其本身就带有创新型发展的概念,同时,面对着2022年许多…

Java程序的运行过程(执行流程)分析

万事知其然,要知其所以然,所以本节带大家来详细了解一下 Java 程序的执行过程。从《使用记事本编写运行Java程序》一节的案例可以看出,Java 程序的运行必须经过编写、编译和运行 3 个步骤。编写:是指在 Java 开发环境中进行程序代…

回溯法--图的m着色问题

问题描述给定无向连通图和m种不同的颜色,用这些颜色为图G的各个顶点着色,每个顶点有一种颜色是否有一种着色方法?使得图G中每条边的两个顶点有不同的颜色这个问题就是图的m可着色判定问题色数:如果有一个图最少需要m种颜色才能使得…

国医大师体验照“镜”测“三高”,深兰科技AI产品秒出健康报告

“请把脸缓慢往左转。” “请将脸回正,请将脸缓慢往右转。” “请放松心情,期待3D面部的生成结果。” 跟随提示音,刚刚被聘任为深兰科技科学院专家委员会医学专家的国医大师严世芸教授饶有兴致地体验着深兰科技AI生理健康检测仪-扁鹊。等待一…

【位图】面对海量数据,如何压缩空间?定位数据?

目录 一、腾讯面试题 二、解决办法——位图 2.1、那么什么是位图? 三、位图的模拟实现 3.1、位图的构造 3.2、存放数据 3.3、检测数据是否存在 3.4、设置某个数据的对应位为0 四、位图模拟代码(完整) 一、腾讯面试题 给40亿个不重复…

Authing 入选 2022 中国产业数字化领军企业

1 月 10 日,产业互联网第一媒体产业家联合数字化报、IT 桔子正式发布了【中国产业数字化领军企业榜单】,评选出 16 个互联网赛道中的领军企业。作为身份认证与访问管理领跑者,Authing 凭借在 SaaS 领域的技术创新与产品优势,成功入…

6.4、域名系统 DNS

1、DNS的作用 如下所示,因特网中的某台主机要访问某台 Web 服务器 只需在用户主机中运行某个游览器软件,在其地址栏中输入要访问的 Web 服务器的域名,并按下回车键即可访问到 Web 服务器所提供的内容 我们在用户主机中使用 ping 命令测试 We…

【小练】day1

day1 选择题 1. 以下for循环的执行次数是&#xff08;&#xff09;。 for(x0,y0;(y123)&&(x<4););A 是无限循环 B 循环次数不定 C 4 D 3 本题主要考察for for(初始化部分&#xff1b;条件判断部分&#xff1b;调整部分) 初始化部分只执行一次。 &&&a…