100个python算法超详细讲解:逆序输出数字

2023-05-16

【100个python算法超详细讲解】@谷哥技术

1.问题描述
编程实现将输入的整数逆序输出。
2.问题分析
前面我们已经接触过很多的递归问题了,这些递归问题可以简单
地分成两类:一类可以归结为数值问题,还有一类为非数值问题。
数值问题的递归是指可以表达为数学公式的问题,如9.1节的猴子
吃桃问题,9.4节的求年龄问题。
非数值问题的递归是指问题本身难以用数学公式来表达的问题,
如9.3节的汉诺塔问题。
对于数值问题,由于本身可以表达为数学公式,所以可以从数学
公式入手来推导出问题的递归定义,然后确定问题的边界条件,从而
最终确定递归函数和递归结束条件。
对于非数值问题,由于其本身不能用数学公式来表达,因此其求
解的一般方法是要自行设计一种算法,进而找到解决问题的一系列操
作步骤。如果能够找到解决问题的一系列递归操作步骤,则非数值问
题也可以使用递归方法来求解。
本节我们要讨论的逆序输出数字就是一个数值问题的递归。问题
本身并不复杂,但通过该问题我们可以对这一类递归问题的编程方法
进行总结和比较,以便于读者在遇到相似的问题时能参照解决。
3.算法设计
该问题要求任意输入一个整数,实现它的逆序输出。因此,首先
要判断输入的整数是正整数还是负整数。无论正负,程序都应该能处
理。如果是负整数,则在逆序输出前应先打印出负号。
接着解决整数的逆序问题。
假设输入的整数保存在变量num中,我们以输入4位的正整数为
例,其他位数的整数可类似地分析。假设输入的4位正整数为abcd。我
们可以这样思考:
1)如果三位数abc已经实现了逆序,则只需打印d与abc逆序后的三
位数即可。
2)如果两位数ab已经实现了逆序,则只需打印c与ab逆序后的两位
数即可。
3)如果一位数a已经实现了逆序,则只需打印b与a逆序后的一位
数即可。显然,a逆序后还是它本身,因此此步可直接打印结果:ba。
4)接着再由第3步向前递推,则可以实现逆序输出abcd这个4位整
数。
由刚才的分析过程可知,显然这是一个递归问题,将大问题逐渐
细化,递归的出口就是对一位数进行逆序操作的结果仍是它本身。
4.确定程序框架
根据算法分析过程,我们可以写出逆序的递归函数reverse(),代码
如下:

# 逆序函数
def reverse(n):
if n != 0:
print("%d" % (n % 10), end="") # 输出正整数n当前的最高位
reverse(n // 10) # 递归调用

上面的代码中加粗的部分表示去掉当前正整数n中的最高位,将剩
下的正整数作为递归函数的实际参数。
5.完整的程序
根据上面的分析,编写程序如下:

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# @author : liuhefei
# @desc: 逆序输出数字
# 逆序函数
def reverse(n):
if n != 0:
print("%d" % (n % 10), end="") # 输出正整数n当前的最高位
reverse(n // 10) # 递归调用
if __name__ == "__main__":
num = int(input("请输入一个整数:"))
# 如果num小于0,就先把num转化字符串,截取第一位 -号,然后将数字逆序,再拼接上
符号输出
if num < 0:
str_num = str(num)
num = str_num[1:] # 剪切掉符号位
print("-", end="")
reverse(int(num))
else:
reverse(num)

6.运行结果
在PyCharm下运行程序,结果如图9.15所示。由图9.15可见,程序
可以正确地将输入的整数逆序输出。

7.问题拓展
(1)逆序输出字符串
与逆序输出数字类似的问题还有逆序输出字符串。下面我们先直
接给出使用递归来逆序输出字符串的完整代码,再进行分析。
逆序输出字符串的完整代码如下:

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# @author : liuhefei
# @desc: 逆序输出字符串
递归函数
# 递归函数
def rvstr(s):
if len(s) <= 1:
return s
return rvstr(s[1:]) + s[0]
if __name__ == "__main__":
str = str(input("请输入一个字符串:"))
str_result = rvstr(str)
print("%s 逆序后: %s" % (str, str_result))

 在上面的代码中,当输入时按Enter键,表示字符串输入结束,可
以开始逆序打印。
在递归函数rvstr(s)中,我们用到了字符串的分片功能,通过递归
调用字符串s的分片剪切实现字符串的逆序功能。
在PyCharm下运行程序,运行结果如图9.16所示。

在Python中,一个字符串相当于一个不可改变序列的列表。一旦这
个字符串被定义了,则该字符串中的每个字符都有了自己确定的位
置,也有了自己的下标,不可改变。
在Python中,可以使用“[]”来访问字符串中指定位置上的字符,这
种方式类似于C语言或Java语言中的数组。在Python语言的字符串中,
字符的序号也是从0开始的,即str[0]表示字符串str中的第1个字符。
与C语言或Java语言不同的是,Python允许以负数表示字符的序
号,负数表示从字符串的末尾处开始计算,字符串的最后一个字符序
号为-1,而不是-0。
上面提到的字符序号也可以理解为是索引,索引用来对单个元素
进行访问。在Python语言中,对一个序列一定范围内的元素进行访问的
技术叫作分片技术,分片是通过冒号相隔的两个索引实现的。分片操
作既支持正数索引,又支持负数索引,这对于访问一个序列的部分元
素很方便。分片操作的实现需要提供序列的两个索引作为边界值,第
一个索引的元素包含在分片内,第二个索引的元素不包含在分片内。
下面提供一个实例代码以帮助读者理解分片,代码如下:

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# @author : liuhefei
# @desc: 序列分片
if __name__ == "__main__":
str = "abcdefghijklmnopqrstuvwxyz" # 定义字符串
print(str[4]) # 取字符串中序号为4的字符,也就是第5个字符串
print(str[-3]) # 从字符串的尾部开始计算,取字符串的倒数第3个字符
print(str[-0]) # -0即是0,也就是取字符串的第一个字符
print(str[-1]) # 取字符串的倒数第一个字符,也就是最后一个字符
#分片
print(str[2:8]) # 取字符串中从第3个字符到第9个字符的内容,不包含第9个字符
print(str[1:1]) # 不包含第2个字符,这里为空
print(str[1:-1]) # 从第2个字符开始到最后一个字符,不包含最后一个字符
print(str[0:-1]) # 从第1个字符到倒数第1个字符,不包含最后一个字符
print(str[-8:-2]) # 从倒数第9个到倒数第2个字符,不包含倒数第9个字符
# 打印为空,在分片中最左边的索引比它右边的索引晚出现在序列中,结果就是一个空值
print(str[-8:0])
print(str[:10]) # 从第1个字符取到第11个字符,不包含第11个字符
print(str[12:]) # 从第13个字符取到最后一个字符
print(str[-9:]) # 从倒数第9个字符开始取
print(str[:-4]) # 从第1个字符取到倒数第4个字符,不包含倒数第4个
print(str[:]) #取出整个字符串

 在PyCharm下运行程序,结果如图9.17所示。

(2)其他数值问题的递归
其他一些数值问题还有求n!、求斐波拉切数列、求最大公约数等
问题。下面我们再介绍使用递归求最大公约数的方法。
用辗转相除法求出两个整数m与n的最大公约数。
本题要求我们使用辗转相除法(也称欧几里德算法或欧式算法)
来求解m和n的最大公约数。辗转相除法的公式如下:

 

由上述公式可知,求m与n的最大公约数问题可以等价于求n与
(m%n)的最大公约数问题。因此,可以把n当作新的m,把(m%n)当作新
的n,则问题再次转换为求新的m与新的n的最大公约数。而求新的m与
新的n的最大公约数又等价于求新的n与(m%n)的最大公约数,如此继续
下去,直到新的n为0,则所求的最大公约数就是当前的m值,这就是利
用辗转相除法求m与n的最大公约数的过程。
例如:求gcd(70,30)。
1)当前m=70,n=30,m%n=10。
2)转换成求gcd(30,10),此时m=30,n=10,由于m%n=0,故结
束,gcd(70,30)=n=10。
根据上面的描述,列出递归算法的步骤:
1)求r=m%n。
2)判断r是否为0。若r=0,则n为所求的最大公约数,输出n。
3)若r!=0,则令m=n,n=r。
4)转到步骤1。
根据上述分析,编写递归函数gcd()如下:

# 递归函数 求最大公约数
def gcd(m , n):
if n == 0:
g = m
else:
g = gcd(n, m % n) # 递归调用
return g

 还可以在递归函数中加入对特殊情况的处理,如m、n为负数的情
况。此时递归函数代码如下:

# 递归函数 求最大公约数
def gcd(m , n):
if m < 0:
m = -m
if n < 0:
n = -n
if n == 0:
g = m
else:
g = gcd(n, m % n) # 递归调用
return g

上面函数中加粗的代码表示如果m、n为负数,则先将其转化为正
整数,再进行下面的操作。
还可以使用条件表达式来简化递归函数的书写,具体代码如下:

# 递归函数 求最大公约数
def gcd(m , n):
if m < 0:
m = -m
if n < 0:
n = -n
return m if n==0 else gcd(n, m%n) # 递归调用

函数中加粗的代码使用了条件表达式,它的执行效果与使用
if...else...结构的效果相同。
完整的程序代码如下:

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# @author : liuhefei
# @desc: 递归求最大公约数
# 递归函数 求最大公约数
def gcd(m , n):
if n == 0:
g = m
else:
g = gcd(n, m % n) # 递归调用
return g
if __name__ == "__main__":
print("请输入两个正整数:")
m = int(input("m = "))
n = int(input("n = "))
g = gcd(m, n) # 调用递归函数
print("%d和%d的最大公约数是:%d" %(m, n,
g));

在PyCharm下运行程序,结果如图9.18所示。

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

100个python算法超详细讲解:逆序输出数字 的相关文章

  • 关于shiro的 subject.getPrincipal()方法

    1 说明 上一篇文章说明了 principal xff0c 而subject getPrincipal 是用来干嘛的 xff0c 他就是来获取你存储的principal xff0c 内部是怎么获取的那 xff0c 多个principal怎么
  • CentOS7 64位安装solr7.2.0

    声明 xff1a 本人为学习solr的新手 xff0c 如编写过程中有部队的地方还请各位大佬指正 本文为原创 xff0c 如要转载请注明出处 你能学到 xff1a 1 linux上solr的安装部署 xff0c 官方给出的运行方式 2 添加
  • 阿里巴巴20121009 研发/算法工程师 笔试试题【修正】

    第19题 a i 在排序后的位置是 i k i 43 k xff0c a i 43 2k 在排序后的位置是 i 43 k i 43 3k xff0c 必然有a i lt 61 a i 43 2k 所以数组a里实际上有2k个各自有序的 交错的
  • printf() % lf出错

    printf 函数中不存在 lf xff0c 输入 double 用 lf 输出用 f
  • 奔腾系列的CPU 和酷睿系列的CPU

    以后奔腾要沦为中下层产品 奔腾D是接替奔腾4的型号 也是INTEL的第一代双核处理器 技术还比较粗糙 发热量控制的也不够好 至于酷睿系列 这可是INTEL的最新力作 性能上有绝对的优势 技术上也对老对手AMD保持了领先 而且功耗控制的也非常
  • 为什么神经网络被称为黑匣子

    数学层面 xff1a 由于网络参数与近似的数学函数之间缺乏明确的连接 xff0c 人工神经网络通常被称为 黑匣子
  • 第八弹 ROS发布者Publisher的编程实现

    1 话题模型 xff08 发布与订阅 xff09 2 创建功能包 catkin create pkg learning topic roscpp rospy std msgs geometry msgs turtlesim 建立一个名为le
  • TRIZ创新思维方法_简要复习

    一 TRIZ介绍 TRIZ理论成功地揭示了创造发明的内在规律和原理 xff0c 着力于澄清和强调系统中存在的矛盾 xff0c 其目标是完全解决矛盾 xff0c 获得最终的理想解 它不是采取折中或者妥协的做法 xff0c 而且它是基于技术的发
  • Generalized Focal Loss: Learning Qualified and Distributed BBoxes for Dense Object Detection论文翻译阅读

    Generalized Focal Loss Learning Qualified and Distributed Bounding Boxes for Dense Object Detection论文翻译阅读 论文下载地址 xff1a 点
  • ubuntu16.04对SD卡进行分区

    赶在2020年上半年的最后一天 xff0c 匆忙地写上一个博客 这篇博客是对自己的一个反思 xff0c 我的博客属于自己完全开辟的内容几很少 xff0c 有些博客大家随便在网上一搜就能找到 说实话 xff0c 有时候我会怀疑自己的智商有问题
  • RT-thread移植指南-RISC-V

    目录 RT thread移植指南 RISC V 1 概述 1 1 移植资料参考 1 2 移植开发环境准备 2 移植步骤 2 1 全局中断开关函数 2 2 线程上下文切换函数 2 3 线程栈的初始化 2 4 时钟节拍的配置 2 5 中断函数
  • 寒假学习心得--从0开始学破解

    寒假学习心得 从0开始学破解 写给和我一样将要接触或者才接触破解 的朋友们 前提 你必须得真正喜欢 她 一 工欲善其事 必先利其器 1 找一个中文版的OD PEID 记得就OD就有咱PYG版的某牛人强化版的等等等等 找一个合适的工具 干起事
  • 常用的“密码重置”代码

    61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61
  • ORACLE多表查询优化

    转自某地 对作者很愧疚 不晓得地址了 ORACLE 多表查询优化 这里提供的是执行性能的优化 而不是后台数据库优化器资料 参考数据库开发性能方面的各种问题 收集了一些优化方案统计如下 当然 象索引等优化方案太过简单就不列入了 嘿嘿 执行路径
  • Word to PDF Converter v3.0 算法分析及注册机

    Word to PDF Converter v3 0算法分析及注册机 详细过程 1 xff0c 主程序在C Program Files doc2pdf DOC2PDF dll xff0c PEID查壳为ASProtect 1 23 RC1
  • 安全策略调整步骤

    1 修改防火墙 xff0c 保留22 SSHD 8081 APACHE 80 关闭端口443 HTTPS 3306 MYSQL 8080 8088 53 123 2 针对PHP的BUG和安全漏洞 xff0c 只有升级版本一途 xff0c 经
  • 获取微信openid(或昵称头像)的授权登录及其代理

    lt php 本页用于微信授权登录及其代理 64 version V2 0 64 author ty1921 lt ty1921 64 gmail com gt 64 param backurl 传get参数backurl xff0c 则授
  • 常用的PHP文件头和HTML5文件头(含移动端)

    lt php PHP Header Created by ty1921 64 gmail com Ver V1 Date 2017 8 18 1 session session start 2 display errors ini set
  • VB+PHP实现在线修改Windows服务器的配置文件

    本文仅供记录 存档备案用 用途 xff1a 某电话转接系统 xff0c 需要每天修改配置文件 并重启服务端程序 原理 xff1a WEB用于展示修改界面 xff0c 提交 保存配置文件的相关数据 VB端用于定时轮训WEB上保存的数据 xff
  • OLLVM分析

    一 LLVM是什么 LLVM最初是Low Level Virtual Machine的缩写 xff0c 定位是一个 xff0c 但是是比较底层的虚拟机 然而LLVM本身并不是一个完整的编译器 xff0c LLVM是一个编译器基础架构 xff

随机推荐

  • A General Optimization-based Framework for Local Odometry Estimation with Multiple Sensors论文翻译整理

    综述部分 x1f4cc 多传感器融合有两个趋势 xff1a 基于滤波的融合 xff08 MSCKF EKF UKF xff09 基于优化的滤波 xff08 BA xff09 基于滤波器的方法对时间同步很敏感 任何迟来的测量都会引起麻烦 xf
  • 按键精灵的5级开发认证,笔试题参考

    4题是抄的 xff0c 只是为了过级 最后得93分 xff0c 可能代码还是不够最优 xff0c 有看出的大大希望能不吝指点 1 写一个脚本 xff0c 要求启动时 xff0c 记录 xff08 录制 xff09 当前鼠标的移动轨迹 xff
  • 常见端口号和对应服务的概念和作用

    端口号的主要作用是表示一台计算机中的特定进程所提供的服务 网络中的计算机是通过IP地址来代表其身份的 xff0c 它只能表示某台特定的计算机 xff0c 但是一台计算机上可以同时提供很多个服务 xff0c 如数据库服务 FTP服务 Web服
  • 51单片机学习历程---单片机入门

    主要用来做控制的 xff0c 如果要驱动外部设备的话 xff0c 需要使用驱动电路 proteus 模拟 51 8位 最小系统 晶振电路 提供时钟 12M xff08 方便计算机器周期 xff09 11 0592M xff08 非常适合串行
  • 手把手教你使用--常用模块--HC05蓝牙模块,无线蓝牙串口透传模块,(实例:手机蓝牙控制STM32单片机点亮LED灯)

    最近在学STM32 xff0c 基本的学完了 xff0c 想学几个模块来巩固一下知识 xff0c 就想到了蓝牙模块 玩啥好难过有很多博客教怎么连的 xff0c 但自己看起来还是有点糊涂 模块的原理和知识点我就不讲解了 xff0c 这里我主要
  • FreeRTOS实时操作系统----机制

    四 机制 目录 四 机制 4 1任务优先级 4 1 1高优先级抢占低优先级 4 1 2时间片 4 2任务调度器 4 3临界段的保护 4 4空闲任务与阻塞延时 4 5任务延时列表 4 6消息队列 4 6 1消息队列的基本概念 4 6 2消息队
  • 三极管导通条件

    NPN三极管 xff0c 箭头朝外 xff1a 高电平导通 PNP三极管 xff0c 箭头朝里 xff1a 低电平导通
  • 74HC1G66模拟开关,多路复用

    SEL为低电平的时候 xff0c SD导通 SEL为高电平的时候 xff0c SD不导通 直接看数据手册
  • 一张图了解MOS管导通条件

    不管他长什么样 xff0c 直接就看箭头指向 箭头向栅极 xff0c 就是nmos管 xff0c 高电平导通 箭头向外 xff0c 就是pmos管 xff0c 低电平导通 一边连了两根线的就是s极
  • Android SDK的安装配置

    SDK xff1a xff08 software development kit xff09 软件开发工具包 被软件开发工程师用于为特定的软件包 软件框架 硬件平台 操作系统等建立应用软件的开发工具的集合 因此 xff0c Android
  • 1.C++简介

    学习目标 xff1a 初识C 43 43 xff0c 介绍C 43 43 一些简单的语法 xff1a 初识C 43 43 数据类型 运算符 程序流程结构 学习内容 xff1a 1 初识C 43 43 一个简单的C 43 43 框架 xff0
  • 死锁形成的原因和四个必要条件

    死锁的概念 死锁是指两个或两个以上的进程 xff08 线程 xff09 在运行过程中因争夺资源而造成的一种僵局 xff0c 若无外力作用 xff0c 这些进程 xff08 线程 xff09 都将无法向前推进 xff0c 这时就形成了死锁 处
  • Android P阻止调用非sdk api后,Atlas该何去何从

    0 背景 自从Android 9 0后 xff0c Android就已经开始着手阻止app开发调用非sdk的api xff0c 也就是被标记为 64 hide的变量 函数 类不可以通过反射调用 xff0c 否则会提示NoSuchMethod
  • 简历应该这么写!

    很多同学刚开始找工作时 xff0c 投出去很多简历 xff0c 但是都石沉大海了 xff0c 没有后文 之所以简历不通过 xff0c 往往都是简历不够 好看 很多大公司HR经常一天要看几百份 xff0c 甚至上千份简历 xff0c 基本都是
  • 希望计算机专业同学都知道这些老师

    C语言教程 翁凯老师 赫斌 翁恺老师是土生土长的浙大码农 xff0c 从本科到博士都毕业于浙大计算机系 xff0c 后来留校教书 xff0c 一教就是20多年 翁恺老师的c语言课程非常好 xff0c 讲解特别有趣 xff0c 很适合初学者学
  • 100个python算法超详细讲解:抓交通肇事犯

    1 xff0e 问题描述 一辆卡车违反交通规则 xff0c 撞人后逃跑 现场有三人目 该事件 xff0c 但都 没有记住车号 xff0c 只记下了车号的一些特征 说 xff1a 牌照的前两位数字是相 同的 xff1b 乙说 xff1a 牌照
  • 100个python算法超详细讲解:百钱百鸡

    1 xff0e 问题描述 中国古代数学家张丘建在他的 算经 中提出了一个著名的 百钱 百鸡问题 xff1a 一只公鸡值五钱 xff0c 一只母鸡值三钱 xff0c 三只小鸡值一钱 xff0c 现 在要用百钱买百鸡 xff0c 请问公鸡 母鸡
  • 100个python算法超详细讲解:水仙花数

    1 xff0e 问题描述 输出所有的 水仙花数 所谓的 水仙花数 是指一个三位数 xff0c 其各位数字的立方 和等于该数本身 xff0c 例如 xff0c 153是 水仙花数 xff0c 因为153 61 1 3 43 1 3 43 3
  • 100个python算法超详细讲解:常胜将军

    100个python算法超详细讲解 64 谷歌学术 1 xff0e 问题描述 有火柴21根 xff0c 两人依次取 xff0c 每次每人只可取走1 xff5e 4根 xff0c 不能多取 xff0c 也不能不取 xff0c 谁取到最后一根火
  • 100个python算法超详细讲解:逆序输出数字

    100个python算法超详细讲解 64 谷哥技术 1 xff0e 问题描述 编程实现将输入的整数逆序输出 2 xff0e 问题分析 前面我们已经接触过很多的递归问题了 xff0c 这些递归问题可以简单 地分成两类 xff1a 一类可以归结