递归函数和内置模块

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)

 

以上是关于递归函数和内置模块的主要内容,如果未能解决你的问题,请参考以下文章

函数递归 二分法 匿名函数 内置函数 模块的使用 模块的搜索路径

python函数装饰器内置函数json及模块

python协程函数递归匿名函数与内置函数使用模块与包

day05匿名函数,内置函数,二分法,递归,模块

递归os.walk内置函数lambdahashlib模块md5加密python安装第三方模块操作mysql数据库

6-1:递归内置函数匿名函数