python专题 --- 递归
如果一个函数在函数内部调用自身本身,这个函数就是递归函数
举例如阶乘函数,其数学递归定义如下:
对应的算法实现
def fact(n):
if n==1:
return 1
return n * fact(n - 1)
实际的执行过程为:
===> fact(5)
===> 5 * fact(4)
===> 5 * (4 * fact(3))
===> 5 * (4 * (3 * fact(2)))
===> 5 * (4 * (3 * (2 * fact(1))))
===> 5 * (4 * (3 * (2 * 1)))
===> 5 * (4 * (3 * 2))
===> 5 * (4 * 6)
===> 5 * 24
===> 120
对应的思路图为:

递归函数特性:
- 必须有一个明确的结束条件;
- 每次进入更深一层递归时,问题规模相比上次递归都应有所减少
- 相邻两次重复之间有紧密的联系,前一次要为后一次做准备(通常前一次的输出就作为后一次的输入)。
- 递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)
递归的概念很简单,下面对遇到的几个递归实例进行总结,以方便后续回顾:
1. 二分查找
2. 快速排序
3. 遍历多重列表元素
4. 汉诺塔
# 方法一:
def quicksort1(nums):
if len(nums) <= 1:
return nums
# 左子数组
less = []
# 右子数组
greater = []
# 基准数
base = nums.pop()
# 对原数组进行划分
for x in nums:
if x < base:
less.append(x)
else:
greater.append(x)
# 递归调用
return quicksort1(less) + [base] + quicksort1(greater)
# 方法二
def quick_sort3():
def fast_sort(li):
if len(li) > 1:
l, mid ,r = deal(li)
return fast_sort(l) + [mid] + fast_sort(r)
else:
return li
def deal(li):
left = 0
right = len(li) - 1
temp = li[-1]
tab = True
while left < right:
if tab:
if li[left] <= temp:
left += 1
else:
li[right] = li[left]
tab = not tab
right -= 1
else:
if li[right] >= temp:
right -= 1
else:
li[left] = li[right]
tab = not tab
left += 1
else:
li[left] = temp
return li[:left], temp, li[right+1:]
# 方法三:
def quick_sort2():
def quick(li,left,right):
if left<right:
mid=partition(li,left,right)
quick(li,left,mid-1)
quick(li,mid+1,right)
return li
def partition(li,left,right):
pivot=li[left]
while left<right:
while left<right and pivot<li[right]:
right-=1
li[left]=li[right]
while left<right and pivot>li[left]:
left+=1
li[right]=li[left]
li[left]=pivot
return left
折半查找
# 折半查找
l = list(range(0, 100, 2))
s = 85
# 方法一:
def cut_find(key, l, start=0):
mid = len(l) // 2
if len(l) >= 1:
if l[mid] == key :
return f'in position: {start+mid+1}'
elif l[mid] > key:
return cut_find(key, l[:mid], start)
else:
return cut_find(key, l[mid+1:], mid)
else:
return 'Can not find'
print(cut_find(51, li, 0))
# 方法二:
def search(li,key,low,high):
mid=(low+high)//2
if key==li[mid]:
return mid
if low>high:
return -1
if key<li[mid]:
return search(li,key,low,mid-1)
else:
return search(li,key,mid+1,high)
拆分多重列表元素:
li = []
def all(l):
global li
if not isinstance(l, int):
for i in l:
all(i)
else:
li.append(l)
return li
汉诺塔:
python专题 --- 递归的更多相关文章
- 关于python最大递归深度 - 998
今天LeetCode的时候暴力求解233 问题: 给定一个整数 n,计算所有小于等于 n 的非负数中数字1出现的个数. 例如: 给定 n = 13, 返回 6,因为数字1出现在下数中出现:1,10,1 ...
- Python的递归
递归 是指函数/过程/子程序在运行过程序中直接或间接调用自身而产生的重入现象.在计算机编程里,递归指的是一个过程:函数不断引用自身,直到引用的对象已知.使用递归解决问题,思路清晰,代码少.但是在主流高 ...
- 【304】python专题-读取xml文件
参考:XML DOM 参考手册(w3school) 参考:python专题-读取xml文件 参考:请问用python怎么修改xml的节点值? 1. 读取标签内的文本(Python) 如下的 xml 文 ...
- Python的递归深度
RuntimeError: maximum recursion depth exceeded while calling a Python object 大意是调用 Python 对象时超出最大深度限 ...
- Python专题三字符串的基础知识
Python专题三字符串的基础知识 在Python中最重要的数据类型包括字符串.列表.元组和字典等.该篇主要讲述Python的字符串基础知识. 一.字符串基础 字符串指一有序的字符序列集合,用单引号. ...
- Python的递归深度问题
Python的递归深度问题 1.Python默认的递归深度是有限制的,当递归深度超过默认值的时候,就会引发RuntimeError.理论在997. 2.解决方法:最大递归层次的重新调整,解决方式是手工 ...
- Python专题——五分钟带你了解map、reduce和filter
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是Python专题第6篇文章,给大家介绍的是Python当中三个非常神奇的方法:map.reduce和filter. 不知道大家看到ma ...
- Python专题——详解enumerate和zip
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是Python专题的第7篇文章,我们继续介绍迭代相关. enumerate 首先介绍的是enumerate函数. 在我们日常编程的过程当 ...
- Python中递归的最大次数
实际应用中遇到了一个python递归调用的问题,报错如下: RuntimeError: maximum recursion depth exceeded while calling a Python ...
随机推荐
- C# 通用数据库配置界面,微软原生DLL重整合
C# 通用数据库配置界面,微软原生DLL重整合 自己整合了 微软自带的数据连接配置界面对话库 Microsoft.Data.ConnectionUI.Dialog.dll 微软自带的数据连接配 ...
- Confluence 6 配置管理员会话的安全
Confluence 通过使用 Confluence administration console 来显示管理员访问后台管理的功能或者管理一个空间.当一个 Confluence 管理员(以管理员身份登 ...
- 【python】ftp连接,主被动,调试等级
示例代码如下: #!/usr/bin/env python # -*- coding: utf-8 -*- import os from ftplib import FTP def ftp_down( ...
- JMeter 中跨线程组 变量值传递的方法
关于jmeter中跨线程组 变量值传递的方法 找了好久,终于找到方法了,赶紧整理下来. 1.在线程组1 中使用__setProperty函数设置jmeter属性值(此值为全局变量值), ...
- 目标检测算法之R-CNN算法详解
R-CNN全称为Region-CNN,它可以说是第一个成功地将深度学习应用到目标检测上的算法.后面提到的Fast R-CNN.Faster R-CNN全部都是建立在R-CNN的基础上的. 传统目标检测 ...
- 三.hadoop mapreduce之WordCount例子
目录: 目录见文章1 这个案列完成对单词的计数,重写map,与reduce方法,完成对mapreduce的理解. Mapreduce初析 Mapreduce是一个计算框架,既然是做计算的框架,那么表现 ...
- 远程桌面管理工具Remote Desktop Connection Manager
使用说明:RDCMan安装好后双击打开RDCMan.exe,首次使用需要添加配置文件扩展名为rdg 1.点击File新建配置文件,这里命名为MRU,存放在安装的根路径下 建好之后,MRU会显示在左侧菜 ...
- .net core 发布后提示Start error
纪录篇: 发布Core版本的项目后一直提示error,通过网络查询资料后确认梳理问题的逻辑 1.验证环境是否支持,开发环境及server环境 参考:https://docs.micr ...
- python之工作目录和文件引用
1.参考 如何获得Python脚本所在目录的位置 Python 相对导入与绝对导入 还没细看 2.不考虑exe打包 sys.path[0] #顶层运行脚本的绝对目录 os.path.split(os. ...
- [转]Tor Browser在国内Windows平台下的超详细教程
https://cloudfra.com/tor-browser-windows.html 下载与安装 首先,你必须身处科学式网络(实在怕网站再出问题),接着就可以点击打开Tor Browser官网, ...