递归函数和内置模块
Posted fdsimin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了递归函数和内置模块相关的知识,希望对你有一定的参考价值。
1. 递归函数: 自己调用自己的函数就叫做递归函数,递归层数理论上是1000层,但是实际随电脑配置而定,996层,997层都是有可能的
1.1 递归函数小案例:
def digui1(n): print(n) if n < 8: digui1(n+1) digui1(3) # 最为简单的一种递归操作,在递归函数"回"的过程中没有代码块执行 def digui2(n): print(n) if n < 8: digui2(n+1) print(n) digui2(3) #3,4,5,6,7,8,8,7,6,5,4,3 # 这种情况, digui2(n+1)下面的代码块会先阻塞,等digui2(n+1)上面的代码块执行完后,再依次执行下面的代码 # 执行下面代码的过程中也是在释放栈帧内存空间 # 用递归写阶乘 def digui3(n): if n < 2: return 1 return n*digui3(n-1) res = digui3(5) print(res) # 120 # 用递归写斐波那契数列 1,1,2,3,5,8,13,21 def shulie(n): # n代表想要打印的第几个斐波那契数 if n == 1 or n== 2: return 1 return shulie(n-1) + shulie(n-2) res = shulie(5) print(res) # 用递归写1到100求和 def qiuhe(n): if n == 1: return 1 return n + qiuhe(n-1) res = qiuhe(100) print(res) # 用递归写n到m求和 def qiuhe2(n,m): if m == n: return n return m + qiuhe2(n,m-1) res = qiuhe2(-1,2) print(res) # 2
1.2 尾递归: 自己调用自己,并且非表达式,将值放在参数中运行
特点: 无论调用多少层,都只占用一层空间,不会有内存溢出的问题,只需要考虑最后一层的结果,但是对解释器是有要求的,目前Cpython解释器并不支持尾递归
1.2.1 尾递归小案例:
# 用尾递归写阶乘 # 方式一: def jiecheng(n,endval = 1): if n <= 1: return endval return jiecheng(n-1,endval*n) res = jiecheng(5) print(res) # 方式二: 防止用户乱传参数 def outter(n): def jiecheng(n,endval): if n <= 1: return endval return jiecheng(n - 1, endval * n) return jiecheng(n,1) res = outter(5) print(res)
2. 数学模块: math
import math # 1.ceil()模块: 向上取整,返回整型 res = math.ceil(3.3) print(res) # 4 res = math.ceil(3.9) print(res) # 4 # 2. floor()模块: 向下取整,返回整型 res = math.floor(3.3) print(res) # 3 res = math.floor(3.9) print(res) # 3 # 3. pow()模块: 计算一个数的N次方,返回浮点型 res = math.pow(3,2) print(res) # 9.0 # 4. sqrt()模块: 开平方运算,返回浮点型 res = math.sqrt(16) print(res) # 4.0 # 5. fabs()模块: 返回一个数的绝对值,类型为浮点型 res = math.fabs(-3) print(res) # 3.0 # 6. mosf()模块: 将一个浮点型数字拆成小数部分和整数部分,组成一个元祖 res = math.modf(-13.6) print(res) # (-0.5999999999999996, -13.0) # 7. copysign()模块:将第二个数的正负号拷贝给第一个数,返回浮点型 res = math.copysign(3,-6) print(res) # -3.0 res = math.copysign(-3,-6) print(res) # -3.0 # 8. 圆周率pi res = math.pi print(res) # 3.141592653589793
3. 随机模块: randon
import random # 1. random(): 随机获取0~1之间的小数,左闭右开(0<=x<1) print(random.random()) # 每次获取的值不一样 # 2. randrange():可获取指定范围内的整数,包含起始值,不包含结束值 res = random.randrange(5) # 从0~4的范围内随机取一个整数 print(res) res = random.randrange(2,5) # 从2~4的范围内随机取一个整数 print(res) res = random.randrange(2,8,2) # 从2~7的范围内隔一个数随机取一个整数,就是从2,4,6中取值 print(res) # 3. randint()从指定范围内随机取一个整数,可以取到最大值,必须只包含两个参数,不能指定步长(了解) res = random.randint(2,8) print(res) # 4. uniform(): 获取指定范围内的随机小数,左闭右开 res = random.uniform(1,3.6) # 指定范围可以是整数也可以是小数 1<=x<3.6 print(res) res = random.uniform(3,1) # 指定范围可以是整数也可以是小数 1<x<=3 print(res) # 5. choise(): 随机获取列表中的一个值(多选一) list1 = ["蓝天","白云","绿叶"] res = random.choice(list1) print(res) # 6. sample(): 随机获取列表中的若干个值,多选多,返回列表 list1 = ["蓝天","白云","绿叶","星星","月亮"] res = random.sample(list1,2) # 从list1中随机抽两个值,组成列表返回 print(res) # 7.shuffle():随机打乱序列中的值 list1 = ["蓝天","白云","绿叶","星星","月亮"] random.shuffle(list1) # 在原列表的基础上直接打乱 print(list1)
3.1 验证码小案例:
import random def yanzhengma(): str1 = "" for i in range(4): b_word = chr(random.randrange(65,91)) s_word = chr(random.randrange(97,123)) num = str(random.randrange(10)) list1 = [b_word,s_word,num] str1 += random.choice(list1) return str1 res = yanzhengma() print(res)
以上是关于递归函数和内置模块的主要内容,如果未能解决你的问题,请参考以下文章
函数递归 二分法 匿名函数 内置函数 模块的使用 模块的搜索路径