递归算法_字符串反转_20230412

news2024/10/6 1:36:30

递归算法-字符串反转

  1. 前言

递归算法对解决重复的子问题非常有效,字符串反转也可以用递归算法加以解决,递归算法设计的关键是建立子问题和原问题之间的相关性,同时需要确立递归退出的条件;如果递归退出的条件无法确定,那么就会出现爆栈的错误(stack overflow)。

  1. 问题描述

给定某个字符串,word=“hello”,通过递归算法实现反转,输出"olleh"字符串。对于递归算法的实现,可以有两种不同的思路,其一是创建一个新的字符串变量,用于保留反转后的字符串;其二是对原字符串直接进行反转,无需借助新的字符串变量。

  1. 子问题分析和递归结束结束条件

对于字符串word=“hello”,其子问题可以通过不断降低字符串长度,从而减低字符的数量。对于字符串word,我们可以构建如下子问题,

word=“hello” 作为原始问题,

word="ello"作为第一个子问题,

word="llo"作为子问题的子问题,

word="lo"作为子问题的子问题的子问题,

word="o"作为子问题的子问题的子问题的子问题–递归结束条件;

word=""空串–递归结束条件

通过上面分析,我们可以选择空串作为递归结束条件,或者选择长度为1的串作为递归结束条件。对于问题描述当中提到两种不同思路,它们分别采用不同的递归结束条件,其中一个方法选择空串作为结束条件,原地反转选择长度为1的子串作为递归的结束条件。

  1. 借助全新字符串变量的递归算法

设计递归函数f(char *word, char *reversal_word, int *i),三个变量分别代表原始字符串,反转后的字符串以及记录反转字符串的下标i.

过程中,我们利用word变为空串时候作为结束条件,在递归返回的时候,提取当前word的首字符,然后保存到reversal_word的第i个字符地址中。

为了更方便理解递归过程,采用图示的方式辅助理解,递归永远都是有去有回,这是由栈的性质决定的,因为程序执行的过程有入栈就必须有出栈,只有这样程序才能完整执行。

在这里插入图片描述

当遇到空字符的时候,这时候递归需要结束,开始返回,代表开始出栈的过程。

在这里插入图片描述

出栈过程中,我们利用word的当前状态,对reversal_word[i]赋值当前的word[0],最终完成源字符串的反转。

  1. 借助全新字符串变量的递归代码实现

递归的过程非常简单,每次把word的指针往前推进1,直至遇到空字符,然后进行回退。

//*i will be set 0 as intial value
void reverse_word(char *word, char *reversal_word, int *i)
{
    char ch;

    if(*word=='\0')
    {
       return;
    }
    else
    {
        reverse_word(word+1,reversal_word,i);
        reversal_word[(*i)++] = *(word + 0);
    }
}

在递归过程中,很容易出现一类错误的算法,这里需要提别提醒,希望引起大家的注意,假定把递归体里面的代码更新成如下格式,好像没有什么错误,但是返回的reversal_word的结果为{‘\0’,‘o’,‘l’,‘l’,‘e’,‘\0’}仔细分析过程,从C语言角度理解,因为首字符为’\0’,它等同于空串。

为什么会出现这种情况呢? 其实道理很简单,原因在于每次word的回退,它其实都提前了一个节拍,因为在递归前word的值已经发生改变,正确的递归中,word+1只是把指针往前推进一步(具体为sizeof(char)字节),但是当word回退的时候,其word的值仍然和递归入口 处的值保持一致。

else
{
    	word=word+1;
		reverse_word(word,reversal_word,i);
        reversal_word[(*i)++] = *(word + 0);
}
  1. 自身反转的递归算法

字符串反转,如果不考虑保留原来的字符串,可以借助字符串本身,对其收尾字符进行有效交换,从对原有字符串完成反转。具体原理就是中间字符视作支点,完成两端字符的交换,这个过程可以借助递归完成。其递归的出口是对字符串的长度进行相应的判断,如果长度减少到1,那么就可以出栈,递归可以掉头返回。

具体来看一下示意图,过程中完成三步操作,在指针往前移动之前,先保留指针指向的字符,然后再交换首字符和末端字符,最后把当前的尾字符赋值为空’\0’,一切完成后,把指针往前推进一步。后面不断重复上面的步骤,直至字符串的长度为1,开始回退(递归出口)

入栈过程

在这里插入图片描述

出栈过程

在这里插入图片描述

  1. 自身反转的代码实现

    当字符串的长度等于1的时候,也就是已经到了原字符串的支点,这个点就是递归的出口,如果再继续反转下去,那么过程结束的时候,又回到原有的状态。

    这个过程中,ch保留首字符是代码成功实现的关键,当递归回退的时候,我们需要利用到递归前保留的ch首字符值,值得一提的是,每个递归中ch属于不同的变量地址,这一点非常关键;另外对于len的长度值的保留的道理也一样,每个递归中的len都属于不同的变量地址。

void reverse_word_2(char *word)
{
    int len;
    char ch;

    len=strlen(word);

    if(len<=1)
    {
        return;
    }
    else
    {
        ch=*(word+0);
        *(word+0)=*(word+len-1);
        word[len-1]='\0';

        reverse_word_2(word+1);

        word[len-1]=ch;

        return;
    }
}
  1. 小结

大量数据结构和算法的实现都依赖递归,无论是深度优先搜索(DFS)还是动态规划(Dynamic programming),其算法的实现都与递归息息相关。本文采用两种不同的思路,借助递归算法对字符串完成反转,更清晰理解了递归的具体过程和基本原理。

其实递归的本质就是分而治之,大事化小,小事化了,从最基础的子问题倒退建立解的过程。

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

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

相关文章

【LeetCode: 面试题 17.13. 恢复空格 | 暴力递归=>记忆化搜索=>动态规划】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

Redis安装和配置

目录本章重点Redis安装Redis启动和停止配置后台启动连接前的配置本章重点 主要掌握安装和启动了解redis的配置文件进行配置掌握Redis几种启动方式 Redis安装 下载 Redis官网 点击下载 解压 然后将下载好的压缩包上传到服务器,进行解压! tar zxvf 进行解压 编译 我们要进行编…

4.12每日一练

题目&#xff1a;给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外&#xff0c;这两个数…

学生信息管理系统【GUI/Swing+MySQL】(Java课设)

系统类型 Swing窗口类型Mysql数据库存储数据 使用范围 适合作为Java课设&#xff01;&#xff01;&#xff01; 部署环境 jdk1.8Mysql8.0Idea或eclipsejdbc 运行效果 本系统源码地址&#xff1a;https://download.csdn.net/download/qq_50954361/87673902 更多系统资源库…

安全运营场景下的机器学习算法应用

观测到一个有意思的现象&#xff1a; 假设把安全划分为 基础安全 和 业务安全&#xff0c;PR类的议题中&#xff0c;会出现分级&#xff1a;基础安全领域&#xff0c;喜欢讲纵深防御&#xff0c;给出一个炫酷的架构图&#xff0c;然后各种技术关键字往上标&#xff1b;业务安全…

Doris集群的安装部署

目录 安装与部署 软硬件配置​ 1、机器选择 2、软件选择 3、环境信息修改和部署架构 4、安装部署Doris 5、启动FE 6、在FE节点启动MySQL客户端 7、在BE节点启动be 8、查看BE状态 8、查看FE状态是否正常 WEBUI 官方建议 安装与部署 该文档主要介绍了部署 Doris 所…

如何压缩Outlook数据文件大小

由于 Outlook 需要管理大量的电子邮件&#xff0c;Outlook 偶尔会出现问题是很正常的。 但是&#xff0c;如果你注意到 Outlook 打开或加载的时间过长&#xff0c;这可能是一个严重的问题。此外&#xff0c;你还可能面临其他问题&#xff0c;比如收件箱加载时间过长&#xff0…

WebWorker、ThreeJs的渲染和控制

在 ios16.4 版本中已经开始支持了 OffscreenCanvas &#xff0c;那看样子&#xff0c;是时候再把Three做一波优化了 背景介绍 在之前的项目经验中&#xff0c;如果使用threejs加载比较大的3d场景&#xff0c;那么在创建 threejs 的对象和绘制的时候&#xff0c;会占用浏览器线…

认识C++《共、枚、指1》

目录 前言: 1.共用体的基本知识 2.匿名共用体 3.枚举 3.1设置枚举值 3.2枚举的应用场景 3.3枚举变量的取值范围 4.地址和自由存储空间 5.指针的思想 6.指针的声明和初始化 前言: 指针内容比较多&#xff0c;还需要再出一篇。久等了&#xff01;&#xff01;我看了我的…

数据库中的视图及三级模式结构

文章目录一、视图二、数据库三级模式结构一、视图 简单地说&#xff0c;视图可以看成是一个窗口&#xff0c;它所反映的是一个表或若干表的局部数据&#xff0c;可以简化查询语句。视图一经定义&#xff0c;用户就可以把它当作表一样来查询数据。 但视图和基本表不同&#xf…

Python算法设计 - Karatsuba乘法

版权声明&#xff1a;原创不易&#xff0c;本文禁止抄袭、转载&#xff0c;侵权必究&#xff01; 目录一、Karatsuba 乘法二、算法思路三、Python算法实现四、作者Info一、Karatsuba 乘法 当你在纸上做两个数字的乘法时&#xff0c;一般我们都是用小时候学到的方法&#xff1a…

22.SSM-JdbcTemplate总结

目录 一、JdbcTemplate对象。 &#xff08;1&#xff09;Spring产生JdbcTemplate对象。 &#xff08;2&#xff09;JdbcTemplate常用操作。 &#xff08;3&#xff09;知识要点。 一、JdbcTemplate对象。 &#xff08;1&#xff09;Spring产生JdbcTemplate对象。 这个是Sp…

AIGC大模型时代下,该如何应用高性能计算PC集群打造游戏开发新模式?

ACT | SIM | ETC | FTG | RAC AVG | RPG | FPS | MUG | PUZ ACT、SIM、ETC、FTG、RAC、RTS、STG、AVG、RPG、FPS、MUG、PUZ、SLG、SPG等游戏类型&#xff0c;需要高性能的计算机来支持运行。为了满足这些游戏的需求&#xff0c;国内服务器厂商不断推出新的产品&#xff0c;采用…

定点数加减运算

定点数加减运算 文章目录定点数加减运算格式相同位宽相同但不同格式运算位宽不同的定点数运算1.转换为S5.10格式的相同位宽2.统一转换为S10.5格式的相同位宽定点数运算可直接通过处理器内置的整数单元实现格式相同 加减法就是对应二进制形式的有符号整数的加减运算 例如 2.71…

[Date structure]时间/空间复杂度

⭐作者介绍&#xff1a;大二本科网络工程专业在读&#xff0c;持续学习Java&#xff0c;努力输出优质文章 ⭐作者主页&#xff1a;逐梦苍穹 ⭐所属专栏&#xff1a;数据结构。数据结构专栏主要是在讲解原理的基础上拿Java实现&#xff0c;有时候有C/C代码。 ⭐如果觉得文章写的…

手写锚点,且随着滚动屏幕自动高亮

入上图效果 通过判断几个id对应的dom离滚动区域上方的高度跟滚动区域高度对比高亮锚点 <template><div v-loading"totalLoading" class"define-target-container"><el-radio-group v-model"ucatsType" class"ucats-setti…

AUTOSAR Gateway介绍

概述 熟悉整车电子架构的朋友们都知道,Gateway(网关)在整车网络架构中协调不同物理链路数据的交换,发挥着数据中枢作用。本文为大家介绍AUTOSAR架构中Gateway的应用方式。 在AUTOSAR架构中,Signal、Signal Group或者PDU从一个源总线接收可以发送到一个或相同或不同协议的总…

ChatGPT可以做WebRTC音视频质量性能优化,惊艳到我了

摘要 随着GPT-4的发布&#xff0c;AI的风越吹越旺。GPT-4可以回答问题&#xff0c;可以写作&#xff0c;甚至可以基于一张草图生成html代码搭建一个网站。即构社区的一位开发者倪同学就基于目前在研究的WebRTC QoS技术点对GPT-3.5跟GPT-4进行一场实验&#xff0c;ChatGPT会取代…

HTTP与HTTPS的区别;TLS握手过程

一、HTTP协议与HTTPS 我们都知道当客户端与服务端需要进行通信时&#xff0c;需要根据一套协议来进行通信。 HTTP全程是超文本传输协议&#xff08;Hyper Text Transfer Protocol&#xff0c;HTTP&#xff09;是一个简单的请求-响应协议&#xff0c;它通常运行在TCP之上。它指…

Redis应用问题及解决

目录 一.缓存穿透 1.1 问题描述 1.2 解决方案 二.缓存击穿 2.1 问题描述 2.2 解决方案 三.缓存雪崩 3.1 问题描述 3.2 解决方案 当数据库压力变大&#xff0c;导致服务访问数据库响应变慢&#xff0c;导致服务的压力变大&#xff0c;最终可能导致服务宕机。 一.缓存穿透 1.1 …