递归的应用之字符串反转
Python列表
内置了一个可以用来反转列表的方法。假设你要让字符串反转,一种比较高效的办法是,把字符串转换为字符列表,之后反转这个列表,再然后将列表转换回字符串。然而,如果使用递归的话,我们就能够非常轻松地编写出一个直接使字符串反转的函数,而不必用列表来作为中间存储。
这样做的基本思想是:把字符串当作一个递归对象。一个大的字符串是由若干个较小的对象组成的,而且这些对象也是字符串。实际上,一种能够把几乎所有序列都进行拆分的非常方便的方法是:
把它的第一个元素当作单独的存在,而这个元素的后面则恰好紧跟着另一个序列。
在字符串这个情况下,我们可以把它拆分成第一个字符和“所有其他的字符”。这样,如果我们反转字符串里的其余部分,并且把第一个字符放在字符串的结尾处,我们就能够把整个字符串反过来了。让我们把这个算法编写成代码,看看会发生什么:
def reverse(s):return reverse(s[1:])+s[0]
注意这个方法的工作原理。切片s[1:]会给出除字符串的第一个字符之外的所有其他字符。然后我们反转这个切片(递归),并且把第一个字符(s[0])连接到这个结果的末尾。用一个具体的例子来进行思考可能会对你的理解更有帮助。假设s是字符串abc,那么s[1:]就是字符串bc。反转它会产生cb,然后再在最后加上s[0],就能够得到cba了。这正好就是我们想要的答案。
然而,遗憾的是,这个功能并不能正常工作。下面是我们尝试运行这段代码时会发生的输出:
[Previous line repeated 996 more times]
RecursionError: maximum recursion depth exceeded
这里只显示了一部分输出。整段输出实际上有1000行之多!那么,是什么错误导致了这个问题呢?
回忆一下,我们提到过,为了构建一个正确的递归函数,我们需要有一个不需要继续递归的基本情况,不然的话递归就变成了无限循环。我们在编写函数代码的时候太着急了,以至于我们忘了要包含一个基本情况
。因此,我们写的代码实际上是一个无限递归
(infinite recursion)。每次调用reverse方法都包含着另一个reverse方法的调用,因此它们会一直执行下去,根本不会返回。当然,每当一个函数被调用的时候,它都会占用一些内存(将参数和局部变量存储在运行时堆栈里),因此这个过程并不能永远地持续下去。Python在第1000次调用之后就终止了这个方法,因为1000是默认的“最大递归深度
”
让我们回过头来找出一个合适的基本情况。在对序列执行递归时,基本情况通常是空序列或者是仅仅包含一个元素的序列。对于字符串反转问题,我们可以使用空字符串来作为基本情况,因为空字符串
是它自己的反转。当递归调用reverse方法的时候,总是会用一个比原始字符串还要短一个字符的字符串。所以,最后我们总会得到一个空字符串。这是reverse方法的正确版本:
def reverse(s):if s == "":return selse:return reverse(s[1:]) + s[0]print(reverse('apple')) #elppa
总结
- 不能忘记基本情况
递归的应用之字符串反转相关推荐
- JAVA字符串反转4种方式
前言 有一些面试官可能在面试Java基础的时候,让你说一下字符串反转,会手撕代码,常见的是四种方法. 一.使用StringBuilder的reverse()方法 个人觉得这是最简单的一种,调用一下自身 ...
- 【Python】函数递归实例之字符串反转、汉诺塔问题分析
递归的定义 函数定义中调用函数自身的方式 两个特性: 链条:计算过程存在递归链条 例如,n!=n*(n-1)!,n!与(n-1)!就构成了递归链条 基例:基础的实例,存在一个或多个不需要再次递归的基例 ...
- python函数递归 字符串反转
4.7 python函数递归 字符串反转 代码: def fanzhuan(s):if len(s)==1:s2=selse:s2=s[-1]+fanzhuan(s[:len(s)-1])return ...
- 【递归】进制转换、字符串反转、判断回文
文章目录 进制转换--十进制转为任意进制 递归 栈 解法一 解法二 字符串反转 递归 栈 判断回文 递归 双端队列 进制转换--十进制转为任意进制 递归 def toStr(n,base):conve ...
- java中什么是反转_Java中如何将字符串反转
目录 一.Java中如何将字符串反转 1.利用 StringBuffer 或 StringBuilder 的 reverse() 成员方法 代码演示: 运行结果: 2.利用 String 的 toCh ...
- java字符串反转方法【全】
搜集的java字符串反转方法,一般用于面试,项目中用的很少··· package com.wsheng.aggregator.algorithm.string;import java.util.Sta ...
- 编程笔试(解析及代码实现):字符串反转(字符串逆序输出)代码实现十多种方法对比(解析思路及其耗费时间)详细攻略
编程笔试(解析及代码实现):字符串反转(字符串逆序输出)代码实现十多种方法对比(解析思路及其耗费时间)详细攻略 目录 字符串反转(字符串逆序输出)代码实现十多种方法对比(解析思路及其耗费时间)详细攻略 ...
- 字符串反转python_Python 反转字符串(reverse)的方法小结
前段时间看到letcode上的元音字母字符串反转的题目,今天来研究一下字符串反转的内容.主要有三种方法: 1.切片法(最简洁的一种) #切片法 def reverse1(): s=input(&quo ...
- python字符串出栈方法_Python 实现字符串反转的9种方法
在做leetcode的试题中,做到反转整数,就涉及到字符串反转,为了尽可能可以写出更多的方法,于是写下这篇文章 样例:如 a='123456789' 反转成 a='987654321' 第一种方法:使 ...
最新文章
- python3+selenium3登录封装与调用(把登陆做成公共模块)
- 多云战略未来五大趋势分析,必看!
- 计算机系统结构总概,计算机系统结构概论
- mysql 查询优化
- AI 中介上岗,人工智能版《安家》?
- Java黑皮书课后题第6章:**6.31(金融应用:信用卡号的合法性验证)和**6.32 编写程序,提示用户输入一个long型整数的信用卡号码,显示这个数字是合法的还是非法的
- 以非生产模式的方式启用SAP Spartacus的服务器端渲染SSR
- 替换更改登陆页面logo与链接
- MATLAB2016下载地址,包含安装教程
- 西瓜书+实战+吴恩达机器学习(十)监督学习之支持向量机 Support Vector Machine
- python学习笔记——Day 3
- Media Session API 为当前正在播放的视频,音频,提供元数据来自定义媒体通知
- java web 项目伪静态_【Java Web】使用URLRewrite实现网站伪静态
- 移动通信网络演进之路
- 用对象的上转型对象、方法重写,抽象编程:求柱体的体积。
- 马化腾教你做产品:改掉这七点,让产品自己说话
- U盘安装苹果系统教程,菜鸟一步一步也能成大牛
- 遇到问题--python--爬虫--urllib的使用协程没有并发的效果
- 康奈尔大学计算机生物学是,康奈尔大学计算生物学难进吗?
- 盘点 | 2017年,哪些黑科技改变了我们的生活?
热门文章
- mark点Z3学习资料整理
- python怎么升级django_线上Django项目python2到3升级日记
- 自动检测技术学习心得体会_公司参加中机建设首届BIM技术应用培训班人员顺利结业...
- 遍历字典_Python编程从入门到实践-连载5(字 典)
- spring学习--引入外部文件,初始化属性
- python重写和重载的区别_Java 重写(Override)与重载(Overload)
- xxxxxxxxxccccxcc
- yolov3损失函数改进_YOLO V3 深度解析 (下)
- datatable的数据进行组内排序_Spark实现分组Top-k排序的四种方案(scala语言)
- 云服务器上部署pytorch,flask部署pytorch-服务端