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

总结

  • 不能忘记基本情况

递归的应用之字符串反转相关推荐

  1. JAVA字符串反转4种方式

    前言 有一些面试官可能在面试Java基础的时候,让你说一下字符串反转,会手撕代码,常见的是四种方法. 一.使用StringBuilder的reverse()方法 个人觉得这是最简单的一种,调用一下自身 ...

  2. 【Python】函数递归实例之字符串反转、汉诺塔问题分析

    递归的定义 函数定义中调用函数自身的方式 两个特性: 链条:计算过程存在递归链条 例如,n!=n*(n-1)!,n!与(n-1)!就构成了递归链条 基例:基础的实例,存在一个或多个不需要再次递归的基例 ...

  3. python函数递归 字符串反转

    4.7 python函数递归 字符串反转 代码: def fanzhuan(s):if len(s)==1:s2=selse:s2=s[-1]+fanzhuan(s[:len(s)-1])return ...

  4. 【递归】进制转换、字符串反转、判断回文

    文章目录 进制转换--十进制转为任意进制 递归 栈 解法一 解法二 字符串反转 递归 栈 判断回文 递归 双端队列 进制转换--十进制转为任意进制 递归 def toStr(n,base):conve ...

  5. java中什么是反转_Java中如何将字符串反转

    目录 一.Java中如何将字符串反转 1.利用 StringBuffer 或 StringBuilder 的 reverse() 成员方法 代码演示: 运行结果: 2.利用 String 的 toCh ...

  6. java字符串反转方法【全】

    搜集的java字符串反转方法,一般用于面试,项目中用的很少··· package com.wsheng.aggregator.algorithm.string;import java.util.Sta ...

  7. 编程笔试(解析及代码实现):字符串反转(字符串逆序输出)代码实现十多种方法对比(解析思路及其耗费时间)详细攻略

    编程笔试(解析及代码实现):字符串反转(字符串逆序输出)代码实现十多种方法对比(解析思路及其耗费时间)详细攻略 目录 字符串反转(字符串逆序输出)代码实现十多种方法对比(解析思路及其耗费时间)详细攻略 ...

  8. 字符串反转python_Python 反转字符串(reverse)的方法小结

    前段时间看到letcode上的元音字母字符串反转的题目,今天来研究一下字符串反转的内容.主要有三种方法: 1.切片法(最简洁的一种) #切片法 def reverse1(): s=input(&quo ...

  9. python字符串出栈方法_Python 实现字符串反转的9种方法

    在做leetcode的试题中,做到反转整数,就涉及到字符串反转,为了尽可能可以写出更多的方法,于是写下这篇文章 样例:如 a='123456789' 反转成 a='987654321' 第一种方法:使 ...

最新文章

  1. python3+selenium3登录封装与调用(把登陆做成公共模块)
  2. 多云战略未来五大趋势分析,必看!
  3. 计算机系统结构总概,计算机系统结构概论
  4. mysql 查询优化
  5. AI 中介上岗,人工智能版《安家》?
  6. Java黑皮书课后题第6章:**6.31(金融应用:信用卡号的合法性验证)和**6.32 编写程序,提示用户输入一个long型整数的信用卡号码,显示这个数字是合法的还是非法的
  7. 以非生产模式的方式启用SAP Spartacus的服务器端渲染SSR
  8. 替换更改登陆页面logo与链接
  9. MATLAB2016下载地址,包含安装教程
  10. 西瓜书+实战+吴恩达机器学习(十)监督学习之支持向量机 Support Vector Machine
  11. python学习笔记——Day 3
  12. Media Session API 为当前正在播放的视频,音频,提供元数据来自定义媒体通知
  13. java web 项目伪静态_【Java Web】使用URLRewrite实现网站伪静态
  14. 移动通信网络演进之路
  15. 用对象的上转型对象、方法重写,抽象编程:求柱体的体积。
  16. 马化腾教你做产品:改掉这七点,让产品自己说话
  17. U盘安装苹果系统教程,菜鸟一步一步也能成大牛
  18. 遇到问题--python--爬虫--urllib的使用协程没有并发的效果
  19. 康奈尔大学计算机生物学是,康奈尔大学计算生物学难进吗?
  20. 盘点 | 2017年,哪些黑科技改变了我们的生活?

热门文章

  1. mark点Z3学习资料整理
  2. python怎么升级django_线上Django项目python2到3升级日记
  3. 自动检测技术学习心得体会_公司参加中机建设首届BIM技术应用培训班人员顺利结业...
  4. 遍历字典_Python编程从入门到实践-连载5(字 典)
  5. spring学习--引入外部文件,初始化属性
  6. python重写和重载的区别_Java 重写(Override)与重载(Overload)
  7. xxxxxxxxxccccxcc
  8. yolov3损失函数改进_YOLO V3 深度解析 (下)
  9. datatable的数据进行组内排序_Spark实现分组Top-k排序的四种方案(scala语言)
  10. 云服务器上部署pytorch,flask部署pytorch-服务端