python数据结构与算法 21 递归的实现和应用

数据结构与算法(python)(数据结构) 整理了数据结构的基础内容,包括列表、栈和队列、链表、哈希表和树的相关知识点 阅读详情

把一个整数变成一个任意进制的字符串

假设你要把一个整数转变成一个从2到16进制的数字组成的字符串,例如,把整数10变成十进制是“10”,二进制就是“1010”。虽然很多算法能够实现,包括在栈的应用中我们讨论过一个算法,但是递归的算法仍然是最简洁的。

先来看个例子,十进制数769。我们有一个字符串,含有10个数字的字符串,类似covString=”0123456789”。那么把一个小于10的数字变成串很简单,如果是数字9,字符串就是convString[9]或“9”。如果我们769分解成3个单数,就是7,6和9,然后分别转成字符串,这样小于10的数字转起来很简单。

估计基点算法要包括三个部分

1.   把原数字转成一串的个位数

2.   把个位数查表转成单个数的字符串

3.   把各个字符串合并

下一步就要考虑怎样改变状态趋向基点。既然处理对象是整数,我们来看一下在数学上是怎么办的。最可能选项是减法和除法,减法也许能行?拿什么减什么呢?不太清楚。然而除法和余数的想法给了一个明确的方向。来看一下,如果用基数来除整数,是什么情况.

用整数10去除769,得到76余9,得到两个数。首先,余数9是小于基数(10)的个位数,能够通过查表迅速转成字符串。其次,得到的商(76)小于原来的769,并朝向基点变动.现在的工作是把76变成字符串,再次用10去除76,得到7余6,现在我们把数字变成了个位数7,小于基数10,可以很容易处理成字符串。

这一连串的操作如图3所示,注意我们要的数字是图解右边的余数。


图3:转换整数为十进制字符串

代码段是算法的实现,基数可以是2-16之间的整数。

def toStr(n,base):
   convertString = "0123456789ABCDEF"
   ifn<base:
      returnconvertString[n]
   else:
      returntoStr(n//base,base)+convertString[n%base]
 
print(toStr(1453,16))


注意第3行我们检查n是否小于进制的基数,,如果是,不用递归,直接从字符串上获得结果。第6行包括了第二和第三定律——自我调用和趋向基点改变状态——使用除法。

我们再跟踪一次算法,这次转化数字10为二进制。



图4整数10转为二进制字符串

图4所示为求得结果的过程,但是看起来顺序似乎不对,但是计算结果又是对的。这是因为我们的递归计算放在前面,这样直到递归结束才会去加余数。如果我们把convertString[n%base]这个式子放在前面,先查找余数的字符串再去计算递归,那么结果就完全反了顺序!但是我们先做递归,直接递归结束返回结果再去和余数相加,结果的顺序就是正确的。这应该让你想起我们在讨论栈时候计算的过程。

堆栈帧:递归的实现

假设我们要把上节递归调用中的toStr和convertString换一下位置,就要修改算法,把字符串压栈,以优先做递归调用。这个修改后的算法如下:

frompythonds.basic.stackimportStack
 
rStack = Stack()
 
deftoStr(n,base):
    convertString ="0123456789ABCDEF"
    whilen>0:
        ifn<base:
            rStack.push(convertString[n])
        else:
            rStack.push(convertString[n%base])
        n = n//base
    res = ""
    whilenotrStack.isEmpty():
        res = res+str(rStack.pop())
    returnres
 
print(toStr(1453,16))


每次调用toStr,我们都把一个字符压栈。回到此前的例子,我们看到经过四次调用toStr,栈内容如图5所示。注意现在我们可以简单地把字符出栈并合并成为答案:“1010”。


图5转化过程中栈内的字符


这个例子让我们得以窥到python是如何实现递归函数调用的。当调用一次函数,系统分配一个堆栈帧来存储函数的变量,当函数返回时,返回值就存在栈顶等待调用函数访问。图6所示是第4行返回语句之后的调用栈情况。


图6 toStr(10,2)产生的调用栈

注意对toStr(2//2,2)的调用,留下“1”在栈内,这个值陏后在调用toStr(1,2)时,表达式"1" + convertString[2%2]用到。然后它又留下"10"在栈顶。这样,python调用栈的过程和我们在递归求和时所有过程明显一样。在求和算法中,你可以认为栈内返回值替换了累加器变量。

堆栈帧也提示了python语言变量作用域的概念,虽然我们一遍又一遍调用函数,但每次都为函数变量开辟了独立的变量作用域。

如果牢牢记住这个栈的思想,你将会发现写递归函数变得容易多了。



Python 数据结构与算法详解 排序算法(英语:Sorting algorithm)是一种能将一串数据依照特定顺序进行排列的一种算法。1. 排序算法的稳定性稳定性:稳定排序算法会让原本有相等键值的纪录维持其相对次序。也就是如果一个排序算法是稳定的,当有两个相等键值的纪录 R 和 S,且在原本的列表中 R 出现在 S 之前,在排序过的列表中 R 也将会是在 S 之前。当相等的元素是无法分辨的,比如像是整数,稳定性并不是一个问题。然而,假设以下的数对将要以他们的第一个数字来排序。 阅读详情

相关推荐

探索Python中的斐波那契数列:实现与应用

斐波那契数列是一个从0和1开始的序列,其中每个数字都是前两个数字的和。F00F11FnFn−1Fn−2n≥2F00F11FnFn−1Fn−2n≥2通过本文,我们详细介绍了如何在Python中实现斐波那契数列的前n项,并探讨了递归、迭代和动态规划三种方法。每种方法都有其优缺点,选择合适的方法取决于具体的应用场景和性能要求。希望这篇文章能帮助你更好地理解和应用斐波那契数列。如果你有任何问题或需要进一步的帮助,请随时联系我。

铭渊老黄 184

python数据结构及算法

python数据结构及算法 一. 数据结构与算法 1. 算法的概念:算法是独立存在的一种解决问题的方法和思想 2. 算法的特征:输入,输出,有穷性,确定性,可行性 3. 时间复杂度是实现算法程序所需要的时间,即算法的优劣 4. 数据结构是指数据对象中数据元素之间的关系 5. 程序 = 数据结构 + 算法 6. 算法是为了解决实际问题而设计的,数据结构是算法需要处理的问题载体 二. 顺序表 1. 顺...

weixin_45841852的博客 2839

CAB单片机开发指南

CAB单片机开发使用指南,IDE安装及烧录注意事项

Zoebuxiangtian的博客 1558

Python数据结构与算法

https://zhuanlan.zhihu.com/p/478635700

qq_35224503的博客 5618

从mseed到SAC格式转换全攻略:mseed2sac工具安装与批量处理技巧

本文详细介绍了如何将mseed格式的地震数据高效转换为SAC格式,涵盖mseed2sac工具的安装、单文件转换技巧、批量处理自动化实现以及元数据高级处理策略。通过具体命令和脚本示例,帮助地震学研究者快速掌握数据预处理的关键技术,提升波形数据分析效率。

ruby5的博客 927

6层高速PCB设计实战:BGA布局与阻抗匹配关键解析

本文深入解析6层高速PCB设计中BGA布局与阻抗匹配的关键技术。通过实战经验分享,详细介绍了六层PCB层叠结构的选择与优化、BGA器件布局技巧、阻抗匹配的实战经验以及高速布线技巧,帮助工程师提升PCB设计水平,确保信号完整性和电源完整性。

weixin_28481133的博客 368

Python数据结构与算法-数据结构(列表、栈、队列、链表)

python的数据结构与算法

little_limin的博客 4333

从Live2D到Unreal Engine:2D与3D虚拟数字人核心技术实现路径解析

本文深入解析了从Live2D到Unreal Engine的2D与3D虚拟数字人核心技术实现路径,涵盖技术选型、制作流程与优化技巧。通过对比2D骨骼动画与3D建模渲染的差异,结合实战案例,帮助开发者根据项目需求选择合适方案,提升虚拟数字人的交互体验与视觉效果。

weixin_30379531的博客 149

python数据结构算法_数据结构与算法:Python语言实现

数据结构与算法:Python语言实现编辑锁定讨论上传视频《数据结构与算法:Python语言实现》是2019年11月机械工业出版社出版的图书,作者是[美]迈克尔T.古德里奇(Michael T.Goodrich)、罗伯特·塔马。书 名数据结构与算法:Python语言实现作 者[美]迈克尔T.古德里奇(Michael T.Goodrich)、罗伯特·塔马ISBN978711160660...

weixin_39887926的博客 871

YOLOv9改进策略【注意力机制篇】| 添加SE、CBAM、ECA、CA、Swin Transformer等注意力和多头注意力机制

这篇文章带来一个经典注意力模块的汇总,虽然有些模块已经发布很久了,但后续的注意力模块也都是在此基础之上进行改进的,对于初学者来说还是有必要去学习了解一下,以加深对模块,模型的理解。

Limiiiing的博客 2892

Python爬虫模拟登录京东并抓取商品数据

京东是一个拥有海量商品数据的电子商务平台。作为爬虫开发者,能够抓取这些数据将为我们提供很多机会进行数据分析、价格预测、市场调研等工作。然而,京东的反爬虫机制非常强大,包括但不限于验证码、动态加载页面、IP封禁等。因此,想要通过Python爬虫抓取京东的数据并不容易。在本文中,我们将从分析京东的登录机制开始,逐步介绍如何使用Python中的各种工具,如。

2201_76125261的博客 1828

数据结构与算法——7. 递归:递归的概念与实现

文章目录一、递归( Recursion)的概念1. 递归的简单应用:数列求和问题使用循环算法解决使用递归算法解决2. 递归程序的执行过程3. 递归三定律二、递归调用的实现1. 递归与栈的关系2. Python对递归深度(递归调用次数)的限制 一、递归( Recursion)的概念 递归是一种解决问题的方法,其精髓在于将问题分解为规模更小的相同问题,持续分解,直到问题规模小到可以用非常简单直接的方式来解决。 递归算法最显著的特征就是:在算法流程中调用自身。 1. 递归的简单应用:数列求和 问题 给定一个列表,

花城的博客 2271

FPGA 学习笔记:Vivado 工程更改FPGA 型号

FPGA 学习笔记:Vivado 工程更改FPGA 型号

坚韧与专注 1万+

[好课推荐]数据结构与算法python实现

[好课推荐]数据结构与算法python实现 觉得有用的话,欢迎一起讨论相互学习~ 官方地址: 中国大学MOOC 主讲人: 北京大学陈斌老师,中国人民解放军陆军装甲兵学院徐丙立老师 https://www.icourse163.org/course/0809PKU068-1206307812 B站也有UP主提供的链接 以下为官网信息,别说了,课程设置超级好~AWSL!!! 课程概述 本课基于主讲教师在北京大学讲授数据结构与算法课(Python版)的多年教学实践经验,面向具有Python语言程序设计基础的大

泛用演化计算、通用人工智能优化模型 1937

SAP-ABAP:新手入门篇——从0到1写出你的第一个ABAP Hello World程序并完成调试运行

本文是ABAP开发入门指南,详细介绍如何创建并运行第一个"Hello World"程序。主要内容包括:通过SE38事务码进入ABAP编辑器;创建以Z/Y开头的程序并保存为本地对象;编写简单的WRITE输出语句;完成语法检查、激活和执行流程;以及初步体验调试功能。文章特别强调ABAP开发的规范要求,如程序命名规则、激活与保存的区别等,并提供了详细的步骤说明和常见问题提示,帮助零基础开发者快速上手ABAP编程。

baidu_35680696的博客 479

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

数据结构与算法python语言实现_数据结构与算法:Python语言实现

出版者的话译者序前言致谢作者简介第1章 Python入门 11.1 Python概述 11.1.1 Python解释器 11.1.2 Python程序预览 11.2 Python对象 21.2.1 标识符、对象和赋值语句 21.2.2 创建和使用对象 41.2.3 Python的内置类 41.3 表达式、运算符和优先级 81.4 控制流程 121.4.1 条件语句 121.4...

weixin_39789094的博客 823

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

数据结构和算法 python和c++语言描述_数据结构和算法 Python和C++语言描述

目 录第 1 章 抽象与分析 11.1 概要 11.1.1 大型编程. 11.1.2 前方的道路 21.2 功能的抽象 31.2.1 契约式设计 31.2.2 验证先验条件 61.2.3 自上而下的设计. 91.2.4 记录副作用. 111.3 算法分析. 121.3.1 线性搜索 121.3.2 二分搜索 141.3.3 非正式的算法比较. 151.3.4 算法的正式分析 17目 录第 1 章 ...

weixin_39559015的博客 242

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

[Python] 数据结构与算法笔记(基本结构和递归)

目录1.基本结构1.1 栈1.1.1 栈的操作1.1.2 栈的应用——简单括号匹配1.1.3 栈的应用——十进制转换成二进制1.1.4 栈的应用——表达式转换1.2 队列1.2.1 队列的操作1.2.2 队列的应用——热土豆问题1.2.3 队列的应用——打印任务几个小算法读取以空格分隔的一行整数 1.基本结构 1.1 栈 “后进先出 LIFO” 进栈和出栈的顺序正好相反 e.g. 浏览器的后退,word的undo 抽象数据类型“栈”是一个有次序的数据集,每个数据项仅从“栈顶”一端加入到数据集中、从数据集中

今天你DEBUG了吗 722

数据结构—排序算法(python实现)

主要介绍了python中实现排序算法的方式与代码

qq_62780060的博客 1204

python 递归深度优先搜索与广度优先搜索算法模拟实现

(1)# 概述 递归:即一个函数调用了自身,即实现了递归 凡是循环能做到的事,递归一般都能做到! (2)# 写递归的过程 1、写出临界条件 2、找出这一次和上一次关系 3、假设当前函数已经能用,调用自身计算上一次的结果,再求出本次的结果 (3)案例分析:求1+2+3+…+n的数和? 概述 ‘’’ 递归:即一个函数调用了自身,即实现了递归 凡是循环能做到的事,递归一般都能做到! ‘’’ 写递归的过程...

weixin_44767512的博客 230

数据结构与算法(python)递归:找零问题

参考自 MOOC数据结构与算法Python版 目录一、什么是递归Recursion初识递归数列求和递归“三定律”递归的应用任意进制转换Python中的递归深度限制递归可视化:分形树Python的海龟作图系统turtle module 一、什么是递归Recursion 递归是一种解决问题的方法,它将问题分解为规模更小的相同问题,在算法流程中调用自身 初识递归 数列求和 问题: 给定一个不定长列表, 返回所有数的和。需要一个循环和一个累加变量来迭代求和。 举个例子: 求全括号表达式的和: total=(1+(3

番茄大人的博客 1396

Python 递归的练习

递归的练习 递归的了解实例 1 # 定义一个类(num是需要给出的参数) 2 # 一定要有临界值 3 # 要有递推的关系 4 def digui(num): 5 6 # 打印num 7 print('$'+str(num)) 8 9 # 如果num大于0 10 if num >...

a18798010127的博客 413

python数据结构与算法 20 递归和递归三定律

递归 本章目标 理解很多复杂问题,如果不用递归就很难解决,用递归也许非常简单 学会怎样进行递归编程 理解并应用递归三定律 理解递归也是一种迭代 建立一个问题的递归方法 理解递归在计算机系统内是如何进行的。 什么是递归? 递归是解决问题的一种方法,它把问题拆解得越来越小,直到变得非常容易,一般情况下,递归过程要包括一个自我访问的函数。与表面看起来似乎不一样,其实递归允许我们写出非常简

量变到质变 3863

数据结构与算法Python版(完整版)P8

大O表示法 Python数据结构 抓大头,数量级 决定运行时间的不仅是问题规模,还跟工况有关,平均状况 常见的七种 P10 变位词判断问题 问题: 解法1 解法2:先排序后比较 def paiXU(s1,s2): a=list(s1) b=list(s2) a.sort() b.sort() pos=0 matches=True ...

weixin_43332626的博客 1578

python dfs算法_python学习课程目录

一、基础篇1.1 Python语言编程导论本节主要介绍什么是python语言,它有什么用、能做什么,相比其他语言它有什么优势,以及它的发展历史与最新的应用成果。1.2 Python编程环境搭建和规范本节主要介绍如何搭建python编译和运行环境、python的代码结构以及python编码规范。1.3 Python基础语法介绍本节主要介绍python的一些基础语法知识,主要包括变量和常量、数据类型、...

weixin_39806779的博客 394
上一篇: python数据结构与算法 20 递归和递归三定律
下一篇: python数据结构与算法 22 递归图形
杀了这个男孩
博客等级 码龄18年 149粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值