python教程(二):python数据结构大全(附代码)
Python 中数据结构的重要性不言而喻,它们是构建高效、可维护代码的基础。数据结构决定了如何存储、组织和操作数据。理解和使用合适的数据结构能够极大地提升程序的性能、简洁性以及代码的可读性。
Python 的基础数据结构有 4 种,分别是 列表 (list)、元组 (tuple)、集合 (set) 和 字典 (dictionary),它们都是 Python 内置的,并不需要额外导入模块。基础数据结构广泛用于存储和操作数据,支持常见的增删改查等操作。
Python 的高级数据结构有 6 种,通常需要从 collections、heapq 和 queue 模块导入,包括 双端队列 (deque)、默认字典 (defaultdict)、有序字典 (OrderedDict)、计数器 (Counter)、堆 (heap) 和 优先队列 (Priority Queue)。这些高级数据结构提供了更高效和专业化的功能,适用于复杂的场景如优先级处理、计数统计、双向数据操作等。
本文将会详细介绍Python的基础数据结构。
1、python基础结构
1.1 列表(list)
列表(list)是一种有序的、可变的序列,用于存储多个元素。它是最常见的基础数据结构之一,可以存储任意类型的对象(数字、字符串、甚至其他列表)。
特点:
有序: 元素按照插入顺序排列。
可变: 可以动态添加、删除和修改元素。
支持重复元素: 列表中的元素可以重复。
元素可以是不同类型: 列表可以包含任何类型的对象(数字、字符串、列表等)。
列表使用方括号 []
来定义,元素用逗号分隔。列表可以很方便进行元素访问、切片、修改、添加、删除,列表的长度使用 len() 函数可以获取列表的长度,合并列表可以通过 + 操作符或 extend() 方法合并两个列表,如果需要遍历列表的索引和元素,可以使用 enumerate() 函数。列表的具体使用如下:
# 创建一个包含多种元素类型的列表
my_list = [1, 2, 3, 'hello', [4, 5]] # 列表可以包含数字、字符串、甚至其他列表# 访问列表中的元素
print(my_list[0]) # 输出: 1,访问第一个元素
print(my_list[-1]) # 输出: [4, 5],访问最后一个元素(支持负索引)# 列表切片
print(my_list[1:3]) # 输出: [2, 3],从索引1开始到索引3之前的元素
print(my_list[:2]) # 输出: [1, 2],获取从开始到索引2之前的元素
print(my_list[::2]) # 输出: [1, 3, [4, 5]],每隔一个元素取一次# 修改列表中的元素
my_list[1] = 'changed' # 修改索引1处的元素为'changed'
print(my_list) # 输出: [1, 'changed', 3, 'hello', [4, 5]]# 添加元素到列表
my_list.append(6) # 在列表末尾添加元素6
print(my_list) # 输出: [1, 'changed', 3, 'hello', [4, 5], 6]# 在指定位置插入元素
my_list.insert(2, 'new') # 在索引2处插入'new'
print(my_list) # 输出: [1, 'changed', 'new', 3, 'hello', [4, 5], 6]# 删除列表中的元素
removed = my_list.pop() # 删除并返回列表末尾的元素
print(removed) # 输出: 6,显示被删除的元素
print(my_list) # 输出: [1, 'changed', 'new', 3, 'hello', [4, 5]]my_list.remove('new') # 删除列表中的第一个'new'元素
print(my_list) # 输出: [1, 'changed', 3, 'hello', [4, 5]]# 获取列表的长度
print(len(my_list)) # 输出: 5,列表中包含5个元素# 合并两个列表
list1 = [1, 2, 3]
list2 = [4, 5, 6]
combined = list1 + list2 # 使用'+'操作符合并列表
print(combined) # 输出: [1, 2, 3, 4, 5, 6]list1.extend(list2) # 使用extend方法合并list2到list1中
print(list1) # 输出: [1, 2, 3, 4, 5, 6]# 对列表排序
nums = [3, 1, 4, 2]
nums.sort() # 原地排序
print(nums) # 输出: [1, 2, 3, 4]# 反转列表
nums.reverse() # 原地反转列表
print(nums) # 输出: [4, 3, 2, 1]# 列表的遍历
for item in my_list:print(item) # 逐个打印列表中的元素# 使用enumerate同时获取索引和值
for index, value in enumerate(my_list):print(f"Index: {index}, Value: {value}") # 打印索引和值
列表的常用方法:
方法 | 描述 |
---|---|
append(x) | 将元素 x 添加到列表末尾 |
extend(iterable) | 将可迭代对象的元素添加到列表末尾 |
insert(i, x) | 在索引 i 处插入元素 x |
remove(x) | 删除列表中第一个值为 x 的元素 |
pop([i]) | 移除并返回索引 i 处的元素(默认移除最后一个元素) |
clear() | 移除列表中的所有元素 |
index(x[, start[, end]]) | 返回列表中第一个值为 x 的元素索引 |
count(x) | 返回元素 x 在列表中出现的次数 |
sort(key=None, reverse=False) | 对列表进行原地排序 |
reverse() | 原地反转列表中的元素 |
copy() | 返回列表的浅拷贝 |
列表的内存管理与性能:
由于列表是动态数组,它的大小可以动态调整,这使得 Python 列表能够以灵活的方式存储不同大小的数据。然而,频繁的插入和删除操作(尤其是在列表的中间部分)可能导致性能下降,因为这些操作可能需要移动列表中的其他元素。
时间复杂度:
访问元素: O(1)
在末尾添加元素 (append()): O(1)
插入或删除(中间或开头): O(n)
遍历列表: O(n)
排序: O(n log n)
应用场景:
列表适用于需要按顺序存储数据且数据量较小的场景。
动态管理元素集合,例如任务列表、购物车、学生名单等。
适用于需要频繁访问、更新或追加数据的场景。
1.2 元组(tuple)
元组(tuple)是 Python 中的一种有序的、不可变的数据结构。元组中的元素一旦创建后就不能被修改,因此它适用于存储那些不需要更改的数据。元组类似于列表,但它的不可变性使它在某些场景下更高效,并且可以作为字典的键。
特点:
有序: 元素按照插入顺序排列。
不可变: 一旦元组被创建,就不能修改其内容(不能添加、删除、修改元素)。
支持重复元素: 元组中的元素可以重复。
元素可以是不同类型: 元组可以包含任意类型的元素(数字、字符串、列表,甚至另一个元组)。
轻量高效: 由于不可变性,元组在内存和性能方面比列表更高效。
元组使用圆括号 () 定义,元素用逗号分隔。如果创建只有一个元素的元组,需要在元素后加一个逗号,否则会被识别为一个普通的类型。元组的具体操作如下:
# 创建一个元组
my_tuple = (1, 2, 3, 'hello', [4, 5])# 访问元组中的元素
print(my_tuple[0]) # 输出: 1
print(my_tuple[-1]) # 输出: [4, 5]# 元组的长度
print(len(my_tuple)) # 输出: 4,元组中有4个元素# 元组切片
print(my_tuple[1:3]) # 输出: (2, 3)# 遍历元组
for item in my_tuple:print(item)# 元组不可变性
# my_tuple[1] = 'new_value' # 这会引发错误,因为元组是不可变的 # 元组解包
a, b, c = (1, 2, 3)
print(a, b, c) # 输出: 1 2 3# 嵌套元组
nested_tuple = (1, (2, 3), (4, (5, 6)))
print(nested_tuple[2][1]) # 输出: (5, 6)# 元组的方法
print(my_tuple.count(2)) # 输出: 1,元素 2 出现了一次
print(my_tuple.index('hello')) # 输出: 3,'hello' 在索引 3 处
元组的常用方法:
方法 | 描述 |
---|---|
count(x) | 返回元素 x 在元组中出现的次数 |
index(x) | 返回元素 x 在元组中第一次出现的索引位置 |
时间复杂度:
访问元素: O(1)
遍历元组: O(n)
元组的应用场景:
不可变数据的存储: 元组适用于存储不需要更改的数据,例如数据库表中的一行记录、GPS 坐标等。
字典的键: 因为元组是不可变的,所以它可以作为字典的键,而列表不行。
解包操作: 在函数返回多个值时,经常使用元组解包来获取这些值。
1.3 集合(set)
集合(set)是 Python 中的一种无序且不重复的可变数据结构,用于存储唯一的元素。集合主要用于执行集合相关的操作,如交集、并集和差集等。集合中的元素必须是不可变的对象(例如,数字、字符串、元组),但集合本身是可变的。
特点:
无序: 集合中的元素没有固定顺序,不能通过索引访问元素。
元素唯一: 集合中的所有元素都是唯一的,自动去重。
可变: 可以动态添加、删除元素。
高效查找: 集合基于哈希表实现,查找、插入、删除操作的时间复杂度为 O(1)。
元素必须是不可变对象: 例如,数字、字符串、元组可以作为集合元素,而列表和字典不能。
集合可以使用大括号 {} 或内置的 set() 函数创建。集合的操作如下:
# 创建集合
my_set = {1, 2, 3, 4, 4} # 自动去重,重复的元素4只保留一个
print(my_set) # 输出: {1, 2, 3, 4}# 添加元素
my_set.add(5) # 向集合中添加元素5
print(my_set) # 输出: {1, 2, 3, 4, 5}# 删除元素
my_set.discard(5) # 删除元素5,不会引发错误
print(my_set) # 输出: {1, 2, 3, 4}# 随机删除并返回集合中的一个元素
popped_element = my_set.pop() # 随机删除并返回一个元素
print(f"被删除的元素: {popped_element}")
print(my_set) # 输出集合的剩余元素# 判断元素是否存在
print(2 in my_set) # 输出: True,2 在集合中
print(5 in my_set) # 输出: False,5 不在集合中# 获取集合的长度
print(f"集合长度: {len(my_set)}") # 输出: 集合长度# 清空集合
my_set.clear() # 清空集合
print(my_set) # 输出: set()# 集合运算
set1 = {1, 2, 3}
set2 = {3, 4, 5}print(set1 & set2) # 输出: {3},交集
print(set1 | set2) # 输出: {1, 2, 3, 4, 5},并集
print(set1 - set2) # 输出: {1, 2},差集
print(set1 ^ set2) # 输出: {1, 2, 4, 5},对称差集(不同时存在于两个集合中的元素)# 遍历集合
for item in set1:print(f"集合中的元素: {item}") # 逐个打印集合中的元素
集合的常用方法:
方法 | 描述 |
---|---|
add(x) | 向集合添加元素 x |
remove(x) | 删除元素 x ,若不存在则报错 |
discard(x) | 删除元素 x ,若不存在不报错 |
pop() | 随机删除一个元素并返回 |
clear() | 清空集合 |
union(set) | 返回两个集合的并集 |
intersection(set) | 返回两个集合的交集 |
difference(set) | 返回当前集合与另一个集合的差集 |
symmetric_difference(set) | 返回两个集合的对称差集 |
issubset(set) | 判断当前集合是否为另一个集合的子集 |
issuperset(set) | 判断当前集合是否为另一个集合的超集 |
isdisjoint(set) | 判断两个集合是否没有交集 |
时间复杂度:
插入元素: O(1)
删除元素: O(1)
查找元素: O(1)
遍历集合: O(n)
应用场景:
去重: 适合用来快速去重。例如,将列表转换为集合后可以自动去除重复元素。
集合运算: 处理交集、并集、差集等集合相关操作的场景,如计算共同好友、差异项等。
快速查找: 利用集合的 O(1) 查找特性,适合用于大量元素的快速存在性检查。
1.4 字典(dict)
字典(dict)是 Python 中的一种无序的、可变的数据结构,用于存储键值对(key-value)。每个键是唯一的,并且与对应的值相映射。字典是 Python 中最常用的数据结构之一,适合存储和快速查找数据。
特点:
无序(Python 3.7+ 版本中字典按插入顺序保存,但仍称为无序结构)。
键唯一: 每个键在字典中是唯一的,重复的键会覆盖之前的值。
可变: 可以动态添加、删除、修改键值对。
键必须是不可变类型: 键可以是字符串、数字或元组,但不能是列表或字典。
快速查找: 字典查找操作的时间复杂度是 O(1),非常高效。
字典使用大括号 {} 定义,键值对之间使用逗号分隔,键和值使用冒号 : 分隔。字典的操作如下:
# 创建字典
my_dict = {'name': 'Alice', 'age': 25, 'city': 'New York'}# 访问字典中的值
print(my_dict['name']) # 输出: Alice# 使用 get() 方法访问不存在的键时返回默认值
print(my_dict.get('country', 'Not Found')) # 输出: Not Found# 修改字典中的值
my_dict['age'] = 26
print(my_dict) # 输出: {'name': 'Alice', 'age': 26, 'city': 'New York'}# 添加新的键值对
my_dict['country'] = 'USA'
print(my_dict) # 输出: {'name': 'Alice', 'age': 26, 'city': 'New York', 'country': 'USA'}# 删除键值对
my_dict.pop('city') # 删除键 'city'
print(my_dict) # 输出: {'name': 'Alice', 'age': 26, 'country': 'USA'}# 使用 del 删除键值对
del my_dict['age']
print(my_dict) # 输出: {'name': 'Alice', 'country': 'USA'}# 获取字典的键、值和键值对
print(my_dict.keys()) # 输出: dict_keys(['name', 'country'])
print(my_dict.values()) # 输出: dict_values(['Alice', 'USA'])
print(my_dict.items()) # 输出: dict_items([('name', 'Alice'), ('country', 'USA')])# 遍历字典的键值对
for key, value in my_dict.items():print(f"Key: {key}, Value: {value}")# 合并两个字典
other_dict = {'age': 30, 'job': 'Engineer'}
my_dict.update(other_dict)
print(my_dict) # 输出: {'name': 'Alice', 'country': 'USA', 'age': 30, 'job': 'Engineer'}# 清空字典
my_dict.clear()
print(my_dict) # 输出: {}
字典的常用方法:
方法 | 描述 |
---|---|
get(key[, default]) | 返回指定键的值,如果键不存在,返回默认值 |
pop(key[, default]) | 删除并返回指定键的值 |
keys() | 返回字典中所有键 |
values() | 返回字典中所有值 |
items() | 返回字典中所有键值对 |
update(dict) | 使用另一个字典或键值对更新当前字典 |
clear() | 清空字典 |
copy() | 返回字典的浅复制 |
时间复杂度:
访问元素: O(1)
插入/删除元素: O(1)
遍历字典: O(n)
应用场景:
快速查找数据: 通过唯一键快速查找对应的值,如用户名到用户数据的映射。
存储配置信息: 字典常用于存储配置信息,如应用程序的设置参数。
数据映射: 字典非常适合存储映射关系,如商品 ID 到商品详情的映射。
相关文章:
python教程(二):python数据结构大全(附代码)
Python 中数据结构的重要性不言而喻,它们是构建高效、可维护代码的基础。数据结构决定了如何存储、组织和操作数据。理解和使用合适的数据结构能够极大地提升程序的性能、简洁性以及代码的可读性。 Python 的基础数据结构有 4 种,分别是 列表 (list)、元…...

MySQL基于GTID同步模式搭建主从复制
系列文章目录 rpmbuild构建mysql5.7.42版本的rpm包 文章目录 系列文章目录一、mysql-5.7.42RPM包构建二、同步模式分类介绍1.异步同步模式2.半同步模式2.1.实现半同步操作流程2.2.半同步问题总结2.3.半同步一致性2.4.异步与半同步对比 3.GTID同步 三、GTID同步介绍1.gtid介绍2…...
RecyclerView的子项长按选择功能
在Android开发中,实现RecyclerView的子项长按选择功能通常涉及到几个关键步骤:设置RecyclerView的ItemTouchListener来监听长按事件,管理选中状态,以及更新UI以反映选中状态。以下是一个基本的实现步骤和示例代码。 1. 定义数据模…...

mongoDB-1
文章目录 一、疑似坑1.11.2 mongo ops manager1.3 mongo features视图固定大小集合(有点类似ringbuffer数据结构,capped collections)(聚簇集合)clustered collection(类比到Mysql的聚簇索引)聚合管道 aggregation pipelineWiredTiger (默认存…...

iKuai使用及设置流程
iKuai使用及设置流程 iKuai安装步骤 一、配置主机 1.电脑连接ETH0网口 2.ETH1网口连接猫上面的千兆口 3.手动配置pc的IP地址和192.168.1.1./24在同一网段 3.浏览器输入192.168.1.1 admin admin 二、外网设置 1.直接联通电信网络设置 2.点击 网络设置-内外网设置-点击接…...
【乐企-业务篇】销项开票接口声明(主要是业务对接)
我们系统销项对接了四家,所以抽象出来一个接口 专门用来定义销项相关的接口声明 代码如下 import java.util.List;/*** User: yanjun.hou* Date: 2024/9/4 10:07* Description:开票策略*/ public interface InvoiceStrategy {/*** 开票** @param order...

Pytest配置文件pytest.ini如何编写生成日志文件?
1、新建pytest.ini文件 [pytest] log_clitrue log_leveLNOTSET log_format %(asctime)s %(levelname)s %(message)s %(filename)s %(funcName)s %(lineno)d log_date_format %Y-%m-%d %H:%M:%Slog_file ./logdata/log.log log_file_level info log_file_format %(asctime…...

rust快速创建Tauri App ——基于create-tauri-app
Tauri App Tauri是一个工具包,可以帮助开发人员使用现有的几乎任何前端框架为主要桌面平台制作应用程序。核心是用Rust构建的,CLI利用Node.js使Tauri成为创建和维护优秀应用程序的真正多语言方法。 cargo install create-tauri-appcreate-tauri-app&am…...

【MySQL】MySQL中JDBC编程——MySQL驱动包安装——(超详解)
前言: 🌟🌟本期讲解Java中JDBC编程,希望能帮到屏幕前的你。 🌈上期博客在这里:【MySQL】MySQL索引与事务的透析——(超详解)-CSDN博客 🌈感兴趣的小伙伴看一看小编主页&a…...

电脑安装OpenWRT系统
通过网盘分享的文件:OpenWRT 链接: https://pan.baidu.com/s/1nrRBeKgGviD31Omji480qA?pwd9900 提取码: 9900 下面开始教程: 1.先把普通U盘制作成一个PE启动盘,我用的是微PE工具箱,直接安装PE到U盘。 2.把写盘工具和openWRT系统…...

说说几款耳机
从前,大约在戴森推出他们那款奇特的发明——戴森耳机与空气净化器组合一年后,人们仍对这个奇怪的产品感到困惑。这款穿戴式空气净化耳机更像是一个实验,缺乏实际用途。回想起那时的评测,大家一致认为这是有史以来最无意义的产品之…...

Excel爬虫使用实例-百度热搜
原来excel也能爬虫抓取数据,而且简单好用 目标网址: https://top.baidu.com/board?tabrealtime 下面是一个excel爬虫的小小例子,爬取了百度热搜的前50(还有一个置顶的热搜没有1,2,3编号) 实现…...

arcgisPro地理配准
1、添加图像 2、在【影像】选项卡中,点击【地理配准】 3、 点击添加控制点 4、选择影像左上角格点,然后右击填入目标点的投影坐标 5、依次输入四个格角点的坐标 6、点击【变换】按钮,选择【一阶多项式(仿射)】变换 7…...
SpringBoot开发——获取HTTP请求头(Header)的三种方法
文章目录 方法一:使用HttpServletRequest实现原理方法二:使用RequestContextHolder实现原理方法三:使用RequestHeader注解实现原理总结 在Spring Boot应用中,获取HTTP请求头(Header)信息是常见的需求&#…...

大模型入门3:理解LLAMA
LLama在transformers库中的代码,以及各部分原理Llama3.1技术报告LLama 33b 微调尝试 Model a stack of DecoderBlocks(SelfAttention, FeedForward, and RMSNorm) decoder block 整体结构:最大的区别在pre-norm x -> norm(x) -> attention() -…...

React学习day07-ReactRouter-抽象路由模块、路由导航、路由导航传参、嵌套路由、默认二级路由的设置、两种路由模式
14、ReactRouter续 (2)抽象路由模块 1)新建page文件夹,存放组件 组件内容: 2)新建router文件夹,在其下创建实例 3)实例导入,使用 4)效果 (3&…...

Unity项目的脚本继承关系
1.Unity项目的脚本继承关系包括四层:自己的脚本、MonoBehaviour、Behaviour、Component、Object。 2.通过F12跳转可以查看各继承类中的方法和属性,如MonoBehaviour类中主要包括协程和相关API。 3.Component类中包含组件的只读属性、消息发送等API&…...

【自动驾驶】决策规划算法(一)决策规划仿真平台搭建 | Matlab + Prescan + Carsim 联合仿真基本操作
写在前面: 🌟 欢迎光临 清流君 的博客小天地,这里是我分享技术与心得的温馨角落。📝 个人主页:清流君_CSDN博客,期待与您一同探索 移动机器人 领域的无限可能。 🔍 本文系 清流君 原创之作&…...

grep 命令:文本搜索
一、grep 命令简介 grep 命令用于在文件中搜索指定模式的文本,并显示匹配的行。 二、grep 命令参数 匹配规则:可以是 普通字符 串或 正则表达式。 grep [选项] [匹配规则] [指定目录]常用选项: -i, --ignore-case&#…...

python画图|中秋到了,尝试画个月亮(球体画法)
学习了一段时间的画图,已经掌握了一些3D图的画法,部分链接如下: python画图|极坐标下的3D surface-CSDN博客 python画图|3D参数化图形输出-CSDN博客 我们今天尝试一下月亮的画法。 【1】官网教程 首先还是到达官网教程学习: …...

从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...

【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...

跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...

基于Springboot+Vue的办公管理系统
角色: 管理员、员工 技术: 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能: 该办公管理系统是一个综合性的企业内部管理平台,旨在提升企业运营效率和员工管理水…...

(一)单例模式
一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...

论文阅读:Matting by Generation
今天介绍一篇关于 matting 抠图的文章,抠图也算是计算机视觉里面非常经典的一个任务了。从早期的经典算法到如今的深度学习算法,已经有很多的工作和这个任务相关。这两年 diffusion 模型很火,大家又开始用 diffusion 模型做各种 CV 任务了&am…...
土建施工员考试:建筑施工技术重点知识有哪些?
《管理实务》是土建施工员考试中侧重实操应用与管理能力的科目,核心考查施工组织、质量安全、进度成本等现场管理要点。以下是结合考试大纲与高频考点整理的重点内容,附学习方向和应试技巧: 一、施工组织与进度管理 核心目标: 规…...

二叉树-144.二叉树的前序遍历-力扣(LeetCode)
一、题目解析 对于递归方法的前序遍历十分简单,但对于一位合格的程序猿而言,需要掌握将递归转化为非递归的能力,毕竟递归调用的时候会调用大量的栈帧,存在栈溢出风险。 二、算法原理 递归调用本质是系统建立栈帧,而非…...