1.递归函数

自己调用自己的函数是递归函数

递:去

归:回

一去一回叫作递归

简单递归
def digui(n):
print(n,'<==1==>')
if n > 0:
digui(n-1)
print(n,'<==2==>') digui(5)
解析:
'''
去的过程:
n = 5 print(5,"<===1===>") 5 > 0 digui(5-1) <=> digui(4) <=> 当前代码在第14行,代码暂停阻塞
n = 4 print(4,"<===1===>") 4 > 0 digui(4-1) <=> digui(3) <=> 当前代码在第14行,代码暂停阻塞
n = 3 print(3,"<===1===>") 3 > 0 digui(3-1) <=> digui(2) <=> 当前代码在第14行,代码暂停阻塞
n = 2 print(2,"<===1===>") 2 > 0 digui(2-1) <=> digui(1) <=> 当前代码在第14行,代码暂停阻塞
n = 1 print(1,"<===1===>") 1 > 0 digui(1-1) <=> digui(0) <=> 当前代码在第14行,代码暂停阻塞
n = 0 print(0,"<===1===>") 0 > 0 条件不满足,返回False,不执行调用,print(0,"<===2===>") 回的过程:
n = 1 从阻塞位置14行继续向下执行 print(1,"<===2===>")
n = 2 从阻塞位置14行继续向下执行 print(1,"<===2===>")
n = 3 从阻塞位置14行继续向下执行 print(1,"<===2===>")
n = 4 从阻塞位置14行继续向下执行 print(1,"<===2===>")
n = 5 从阻塞位置14行继续向下执行 print(1,"<===2===>")
到此代码全部执行结束 543210012345
''' '''
递归函数有回的过程,有两种情况可以触发:
(1)当最后一层函数全部执行结束的时候,有触底反弹的过程(回马枪),回到上层函数空间的调用处
(2)遇到return返回值,直接返回上层空间的调用处 函数在运行的时候,需要内存开辟空间才可以,这个空间叫做栈帧空间
递归:
(1)去的过程就是不停的开辟栈帧空间,在回的时候,就是不停的释放栈帧空间,
递归函数就是不停的开辟和释放栈帧空间的一个完整的过程
(2)回的时候有两种触发的机制,要么是最后一层函数空间全部执行完毕,要么是遇到return,都会触底反弹(回马枪)
(3)写递归函数的时候,必须给与跳出的条件,如果递归的层数过多,不推荐使用,容易内存溢出或者蓝屏
(4)递归调用每一层空间都是独立的个体,独立的副本,资源不共享,可以通过return来完成值的传递。
''' #官方说法,递归最大深度是1000层,具体按照机器来看
def deepfunc():
deepfunc() deepfunc() #996

  

# 求任意数n的阶乘:5!= 5*4*3*2*1

#普通方法
def func(n):
total = 1
for i in range(1,n+1):
total *= i
'''
total = total * i => 1 * 1
total = total * i => 1 * 1 * 2
total = total * i => 1 * 1 * 2 * 3
total = total * i => 1 * 1 * 2 * 3 * 4
total = total * i => 1 * 1 * 2 * 3 * 4 * 5
'''
return total
res = func(5)
print(res) #递归写法
def jiecheng(n):
if n <= 1:
return 1
return n*jiecheng(n-1)
res = jiecheng(5)
print(res)
#jiecheng(1) =>1
'''
#代码解析:
#去的过程
n = 5 return 5 * jiecheng(5 - 1) => 5*jiecheng(4)
n = 4 return 4 * jiecheng(4 - 1) => 4*jiecheng(3)
n = 3 return 3 * jiecheng(3 - 1) => 3*jiecheng(2)
n = 2 return 2 * jiecheng(2 - 1) => 2*jiecheng(1)
n = 1 return 1 #回的过程
n = 2 return 2 * jiecheng(1) => 2*1 [jiecheng(2)]
n = 3 return 3 * jiecheng(2) => 3*2*1 [jiecheng(3)]
n = 4 return 4*jiecheng(3) => 4*3*2*1 [jiecheng(4)]
n = 5 return 5*jiecheng(4) => 5*4*3*2*1 [jiecheng(5)]
res = jiecheng(5) <==> 5*4*3*2*1 = 120
''' # 尾递归(自己调用自己,并且非表达式)[把值放到参数中运算](推荐)
'''
无论调用多少次函数,都只占用一份空间
好处,只需要考虑最后一层空间的结果是多少,就不用额外考虑回的过程了
cpython解释器目前不支持
''' def jiecheng(n,endval):
if n <= 1:
return endval
return jiecheng(n-1,endval*n) res = jiecheng(5,1)
print(res) #优化一(防止用户乱传参数)
def outer(n):
def jiecheng(n,endval):
if n <= 1:
return endval
return jiecheng(n-1,endval*n)
return jiecheng(n,1)
print(outer(5)) #优化二(防止用户乱传参数)
def jiecheng(n,endval =1)
if n <=1:
return endval
return jiecheng(n-1,endval*n)
print(jiecheng(5))
'''
#代码解析:
#去的过程
n = 5,endval = 1
return jiecheng(5-1,endval*n) => return jiecheng(4,1*5)
n = 4,endval = 1*5
return jiecheng(4-1,endval*n) => return jiecheng(3,1*5*4)
n = 3,endval = 1*5*4
return jiecheng(3-1,endval*n ) => return jiecheng(2,1*5*4*3)
n = 2,endval = 1*5*4*3
return jiecheng(2-1,endval*n ) => return jiecheng(1,1*5*4*3*2)
n = 1,endval = 1*5*4*3*2
if 1 <= 1 条件满足 return endval => return 1*5*4*3*2 # 回的过程
n = 2 return 1*5*4*3*2
n = 3 return 1*5*4*3*2
n = 4 return 1*5*4*3*2
n = 5 return 1*5*4*3*2
到此程序全部结束;
''' #2.斐波那契数列,用递归 1 1 2 3 5 8 13 ...
def feb(n):
if n==1 or n==2:
return 1
#当前值n = 上一个值(n-1) + 上上个值(n-2)
return feb(n-1) + feb(n-2)
res = feb(5)
print(res)
"""
#代码解析:
n = 5 return feb(4) + feb(3) <=> 3 + 2 => 5 feb(4) feb(3)
feb(3) + feb(2) feb(2) + feb(1)
feb(2)+feb(1) feb(4) feb(3)
feb(3) + feb(2) feb(2) + feb(1)
1+1 feb(4) feb(3)
2 + 1 1 + 1
feb(4) = 3 feb(3) = 2
"""

  

2.数学模块

math 数学模块
模块.方法()
import math #ceil() 向上取整 *****
res = math.ceil(3.01)
print(res) #floor() 向下取整操作 *****
res = math.floor(4.1)
print(res) #pow() 计算一个数值的N次方(结果为浮点数)(对比内置函数pow)
res = math.pow(2,3)
print(res) #2**3 #sqrt() 开平方运算(结果浮点数) 参数= 某个数的平方
res = math.sqrt(9)
print(res) #3.0 #fabs() 计算一个数值的绝对值(结果为浮点数)(对比内置abs)
res = math.fabs(-9)
print(res) #modf() 将一个数值拆分为整数和小数两部分组成元组
res = math.modf(-19.8)
print(res) #copysign() 将参数第二个数值的正负号拷贝给第一个(返回一个小数)
res = math.copysign(-90,-18)
print(res) #-90.0 #fsum() 将一个容器数据中的数据进行求和运算(结果浮点数)(对比内置sum)
lst = [1,2,3,4]
res = math.fsum(lst)
print(res) #圆周率常数 pi
res = math.pi
print(res)

  

3.随机模块 random

# ### 随机模块 random
import random #random() 获取随机0-1之间的小数(左闭右开) 0<= x <1
res = random.random()
print(res) #randrange() 随机获取指定范围内的整数(包含开始值,不包含结束值,间隔值) 同range *****
#一个参数的用法
res = random.randrange(3) #0 1
#二个参数的用法
res - random.randrange(3,7) #3,4,5,6
#三个参数的用法
res = random.randrange(3,10,2) #3,5,7,9
print(res) #randint() 随机产生指定范围内的随机整数(可以获取到最大值)[了解]
res = random.randint(1,3) #1,2,3
print(res) #uniform() 获取指定范围内的随机小数(左闭右开)
res = random.uniform(1,3) #1<= x <3
print(res)
res = random.uniform(3,1) #3 >= x >0
print(res)
"""
"Get a random number in the range [a, b) or [a, b] depending on rounding."
return a + (b-a) * self.random() a = 3 , b = 1
return a + (b-a) * 0~1
return 3 + (1-3) * 0~1
return 3 + -2 * (0~1) 最大值:3 + -2 * 0 = 3
最小值:3 + -2 * 1 = 1 1< x <=3
""" #choice() 随机获取序列中的值(多选一)
lst = ["周杰伦","蔡徐坤","易烊千玺","神秘boy"]
res = random.choice(lst)
print(res) #自定义choice函数
def mychoice(lst):
#随机获取0~3的下标
num = random.randrange(len(lst))
#通过下标来获取列表的值
return lst[num]
print(mychoice(lst)) #lambda表达式
mychoice = lambda lst : lst[random.randrange(len(lst)]
print(mychoice(lst)) #sample() 随机获取序列中的值(多对多) #返回列表
lst = ["周杰伦","蔡徐坤","易烊千玺","神秘boy"]
res = random.sample(lst,2) # 第二个参数为随机返回2个
print(res) #shuffle() 随机打乱序列中的值(直接打乱原序列)
lst = ["周杰伦","蔡徐坤","易烊千玺","神秘boy"]
random.shuffle(lst)
print(lst) #随机验证码 4位 大小写字母数字
#chr => 给ascii码返回对应的字符
'''
A~Z
a~z
0~9
'''
#A => 65
#a => 97
print(chr(65)) def yanzhengma():
strvar = ''
for i in range(4):
# 大写字母 A-Z 65-90
b_word = chr(random.randrange(65,91))
# 小写字母 a-z 97-122
s_word = chr(random.randrange(97,123))
# 数字0-9
num = str(random.randrange(0,10))
#把可能的字符都放在列表里,一次抽一个
lst= [b_word,s_word,num]
strvar += random.choice(lst)
return strvar
res = yanzhengma()
print(res)

  

总结:今天主要讲了递归函数,数学模块math,随机模块random。

递归函数重点,目前还没完全弄明白,需继续研究

重点:递归函数,数学模块,随机模块---day14的更多相关文章

  1. s14 第5天 时间模块 随机模块 String模块 shutil模块(文件操作) 文件压缩(zipfile和tarfile)shelve模块 XML模块 ConfigParser配置文件操作模块 hashlib散列模块 Subprocess模块(调用shell) logging模块 正则表达式模块 r字符串和转译

    时间模块 time datatime time.clock(2.7) time.process_time(3.3) 测量处理器运算时间,不包括sleep时间 time.altzone 返回与UTC时间 ...

  2. Python——模块——随机模块

    1.引用模块 import random 2.随机整数 random.randint(a,b) 3.随机浮点数 random.uniform(a,b) 4.从列表中随机取元素 random.choic ...

  3. python模块--随机模块

    import random print(random.random()) # 随机产生一个(0,1)的 float 0.026244299361600776 print(random.randint( ...

  4. python常用标准库(math数学模块和random随机模块)

    常用的标准库 数学模块 import math ceil -- 上取整 对一个数向上取整(进一法),取相邻最近的两个整数的最大值. import math res = math.ceil(4.1) p ...

  5. python-Day5-深入正则表达式--冒泡排序-时间复杂度 --常用模块学习:自定义模块--random模块:随机验证码--time & datetime模块

    正则表达式   语法:             mport re #导入模块名 p = re.compile("^[0-9]") #生成要匹配的正则对象 , ^代表从开头匹配,[0 ...

  6. random os 序列化 模块模块 随机选择

    # 1 random 模块 随机选择# import random#随机取小数# ret = random.random() #空是0到1之间的小数字# print(ret)# # 0.0799728 ...

  7. nginx随机模块——ngx_http_random_index_module

    今天我给大家分享一个挺好玩的模块,随机变换网站首页的模块 这个模块他的作用于只有在location中,具体写法如下 只需要在localtion开启这个模块就好了,然后呢我们在/usr/share/ng ...

  8. python的内置模块random随机模块方法详解以及使用案例(五位数随机验证码的实现)

    1.random(self): Get the next random number in the range [0.0, 1.0) 取0到1直接的随机浮点数 import random print( ...

  9. random随机模块,time时间模块

    random /随机模块: 作用: 在某个范围内取到每一个值得概率是相通的. 一.随机小数 random.random() import random print(random.random())  ...

  10. python模块知识二 random -- 随机模块、序列化 、os模块、sys -- 系统模块

    4.random -- 随机模块 a-z:97 ~ 122 A-Z :65 ~ 90 import random #浮点数 print(random.random())#0~1,不可指定 print( ...

随机推荐

  1. [转帖]Linux AWK工作原理

    https://www.cnblogs.com/yeyuzhuanjia/p/13967513.html 本篇文章我们主要为大家介绍 AWK 是如何工作的. AWK 工作流程可分为三个部分:1.读输入 ...

  2. 【转帖】调教LLaMA类模型没那么难,LoRA将模型微调缩减到几小时

    https://www.thepaper.cn/newsDetail_forward_23250236 LoRA 微调方法,随着大模型的出现而走红. 最近几个月,ChatGPT 等一系列大语言模型(L ...

  3. [转帖]linux性能优化-内存回收

    linux文件页.脏页.匿名页 缓存和缓冲区,就属于可回收内存.它们在内存管理中,通常被叫做文件页(File-backed Page). 通过内存映射获取的文件映射页,也是一种常见的文件页.它也可以被 ...

  4. [转帖]Elasticsearch 技术分析(七): Elasticsearch 的性能优化

    https://www.cnblogs.com/jajian/p/10176604.html 硬件选择# Elasticsearch(后文简称 ES)的基础是 Lucene,所有的索引和文档数据是存储 ...

  5. nginx 最简单的在同一个配置文件里面将http 监听的端口转发到其他端口的方法

    今天发现一个问题, 我这边修改了nginx 的listen的端口之后 应用出现了问题 无法使用. 想到之前曾经试验过 tcp 的 proxy 所以就想到直接再配置文件的默认添加一句话 启动TCP的 端 ...

  6. 银河麒麟安装LLDB的方法以及调试 dump 文件 (未完成)

    今天同事要进行 lldb进行调试dotnet的bug 本来在x86 上面进行相应的处理 但是发现报错. 没办法 正好有一台借来的arm服务器就搞了一下. 简单记录一下安装方法 1. 安装 apt的so ...

  7. [转贴]中国铁塔发布2020年中期财报:营收、利润双增,高效支撑5G规模建设

      中国铁塔发布2020年中期财报:营收.利润双增,高效支撑5G规模建设 https://tech.sina.com.cn/roll/2020-08-11/doc-iivhuipn8046256.sh ...

  8. 8.2 C++ 引用与取别名

    C/C++语言是一种通用的编程语言,具有高效.灵活和可移植等特点.C语言主要用于系统编程,如操作系统.编译器.数据库等:C语言是C语言的扩展,增加了面向对象编程的特性,适用于大型软件系统.图形用户界面 ...

  9. 三星发布990 EVO SSD:同时支持PCIe 4.0和PCIe 5.0

    1月8日消息,三星发布了新款产品--990 EVO SSD,这是首款同时支持了PCIe 4.0 x4及PCIe 5.0 x2通道的SSD. 据了解,990 EVO面向中端市场,为2280 M.2规格, ...

  10. 10、数据库学习规划:MySQL - 学习规划系列文章

    MySQL数据库是笔者认识的几个流行的数据库之一.类似于Linux重装系统,其也是开源的,最主要是有很多的社区支持,众多的开发者对其能够进行使用,所以其功能也挺强大,便于使用.通过对MySQL数据库的 ...