六. python进阶(递归)

一 .递归

在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数

递归函数: 一个会调用自身的函数称为递归函数凡是循环能干的事情 递归都能干方式:   写出临界条件   我这一次和上一次的关系   假设当前函数已经能用 调用自身计算上一次结果 在求出本次的结果

必须有一个明确的结束条件;
每次进入更深一层递归时,问题规模相比上次递归都应有所减少
相邻两次重复之间有紧密的联系,前一次要为后一次做准备(通常前一次的输出就作为后一次的输入)。
递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧
。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出

 
import sys
print(sys.setrecursionlimit(1000))   # sys.setrecursionlimit()  #设置最大递归层数

print(sys.getrecursionlimit())                                   #获取最大递归层数
# RecursionError: maximum recursion depth exceeded while calling a Python object  递归的错误 最大的深度
def aa():
    print("1111")
    aa()
    print("22222222")
aa()

1111
1111
1111

..................

# 测试递归调用最大的深度 998           997
n=0
def cc():
    global n
    n+=1
    print(n)
    print("11111111111")
    cc()
cc()

1.递归运行原理

def rec(i):   #定义函数
    print(i)
    if i/2 > 1:   #判断递归条件,退出
        re = rec(i/2)  #递归函数自身
        print(‘返回值:‘,re)
    print(‘上层递归值:‘,i)
    return i     #返回值

rec(10)
# """#运行原理:首先运行函数传参10给函数,打印10,判断条件满足,递归
# #函数参数值为(10/2)5,打印i的值5,等递归到1.25时,判断条件不满
# #足后,才打印上层递归的值,此时递归的值为1.25,return递归最后一
# #层的值1.25,退出最后一层递归,继续一层层退出递归,最后返回最上层
# #递归值结束函数。
# 5.0
# 2.5
# 1.25
# 上层递归值: 1.25
# 返回值: 1.25
# 上层递归值: 2.5
# 返回值: 2.5
# 上层递归值: 5.0
# 返回值: 5.0
# 上层递归值: 10"""

2. 递归案例

# # 输入一个数(大于等于1) 求 1+2+3.......的和
# # 简单的递归
def sum2(n):
    if n==1:
       return 1
    else:
       return n+sum2(n-1)
res=sum2(5)
print(res) #3
# 5+sum2(4)
# 5+4+sum2(3)
# 5+4+3+sum2(2)
# 5+4+3++2sum2(1)
# 5+4+3+2+1
#递归分解执行步骤
def sum2(5):
    if 5==1:
       return 1
    else:
       return 5+sum2(5-1)
                         4
def sum2(4):
    if 4==1:
       return 1
    else:
       return 4+sum2(4-1)
                   3

def sum2(3):
    if 4==1:
       return 1
    else:
       return 3+sum2(3-1)
                   2
def sum2(2):
    if 4==1:
       return 1
    else:
       return 2+sum2(2-1)
                    1

def sum2(1):
    if 1==1:
       return 1
    else:
       return n+sum2(n-1)
def foo(arg1,arg2,stop):
    if arg1 == 0:
        print(arg1,arg2,"第一次")
    arg3 = arg1 + arg2
    print(arg1,arg2,arg3,"第二次")
    if arg3 < stop:      #判断套件不满足时退出递归
        foo(arg2,arg3,stop)   #递归函数,传送参数arg2,arg3,stop给arg1,arg2,stop

foo(0,1,50)
# 1
# 1 1
# 1 2
# 2 3
# 3 5
# 5 8
# 8 13
# 13 21
# 21 34
# 34 55‘
def age(n):
    if n==4:
        return 40
    elif n>0 and n<4:
        return age(n+1)+2
print(age(1))

# 解析上面递归方法
def age(1):
    if 1==4:
        return 40
    elif 1>0 and 1<4:
        return age(1+1)+2
                 44

def age(2):
    if 2==4:
        return 40
    elif 2>0 and 2<4:
        return age(2+1)+2
                  42
def age(3):
    if 3==4:
        return 40
    elif 3>0 and 3<4:
        return age(3+1)+2
                   40

def age(4):
    if 4==4:
        return 40
    elif n>0 and  n<4:
        return age(n+1)+2
def sum2(n):
    if n==1:
       return 1
    else:
       aa= n + sum2(n - 1)

       return  aa
res=sum2(6)
print(res)

# 6+5+4+3+2+1
# 斐波拉契竖列
# 后一项与前一项之差是不变的,这种数列称为等差数列。
# 斐波那契数列数列从第3项开始,每一项都等于前两项之和。
# 例子:数列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368......

def bb(n):
   if n==1or n==2:
     return 1
   return bb(n-1)+bb(n-2)
            # return 1+1     4  3
d=bb(4)
print(d)

# 1+1+1

# def bb(4):
#    if n==1or n==2:
#      return 1
#    return bb(4-1)+bb(4-2)
阶乘
# def bb(3):
#     if n == 1 or n == 2:
#         return 1
#     bb(2) + bb(1)
#
# def bb(2):
#     if n == 1 or n == 2:
#         return 1
#     bb(2) + bb(1)
#     print(1+1)"""

# 阶乘 1*2*3
def fac(n):
    if n==1:
        return 1
    return n*fac(n-1)
print(fac(5))
#
# 5*4*3*2*1
def b(aa):
    print(aa)
    if int(aa/2)==0:
       return aa
    res=b(int(aa/2))

    return res

b(10)

# 10
# 5
# 2
# 1
# 输入一个数(大于等于1) 求 1+2+3.......的和
def sum1(n):
   sum=0
   for x in range(1,n+1):

        print("x的值--------",x)

        sum+=x

        print("sum的值==",sum)

   return sum

res=sum1(4)

print(res)   #15

"""
x的值-------- 1
sum的值== 1
x的值-------- 2
sum的值== 3
x的值-------- 3
sum的值== 6
x的值-------- 4
sum的值== 10
10"""

原文地址:https://www.cnblogs.com/Sup-to/p/10851853.html

时间: 2024-10-01 07:02:33

六. python进阶(递归)的相关文章

Python进阶(三十六)-Web框架Django项目搭建全过程

Python进阶(三十六)-Web框架Django项目搭建全过程 ??IDE说明: Win7系统 Python:3.5 Django:1.10 Pymysql:0.7.10 Mysql:5.5 ??Django 是由 Python 开发的一个免费的开源网站框架,可以用于快速搭建高性能,优雅的网站! Django 特点 强大的数据库功能 用python的类继承,几行代码就可以拥有一个丰富,动态的数据库操作接口(API),如果需要你也能执行SQL语句. 自带的强大的后台功能 几行简单的代码就让你的网

Python进阶(六)----装饰器

Python进阶(六)----装饰器 一丶开放封闭原则 开放原则: ? 增加一些额外的新功能 封闭原则: ? 不改变源码.以及调用方式 二丶初识装饰器 装饰器: ? 也可称装饰器函数,诠释开放封闭原则,装饰器的本质是闭包 ###普通版装饰器 import time def timmer(x): # x 接收的原函数的内存地址 def inner(): start_time=time.time() x() # 执行 原函数 print(f'执行效率{time.time()-start_time}'

Python进阶(十六)----面向对象之~封装,多态,鸭子模型,super原理(单继承原理,多继承原理)

Python进阶(十六)----面向对象之~封装,多态,鸭子模型,super原理(单继承原理,多继承原理) 一丶封装 , 多态 封装: ? ? ? ? ? ?将一些东西封装到一个地方,你还可以取出来 ? ? ? ? ? ?类设置静态属性, 设置一些方法 或者 对象, 对象可以在其对象封装一些属性 多态: ? ? ? ? ? ?python默认支持多态, 多态指的是一种事务具有多种形态 ? ? ? ? ? ?1.多态可以增加代码的灵活度: ? ? ? ? ? ?2.以继承和重写父类方法为前提: ?

有哪些比较好的讲Python进阶的博客?

Python是一种动态解释型的编程语言,它可以在Windows.UNIX.MAC等多种操作系统以及Java..NET开发平台上使用.不过包含的内容很多,加上各种标准库.拓展库,乱花渐欲迷人眼.因此如何进阶Python显得非常重要. 接下来看看比较好的讲Python进阶的博客,我这有十个,希望对你有帮助. 第一个是Planet Python,这是最出名的python博客其中之一: 第二个博客是Eli Bendersky 的博客:Eli Bendersky's website: 第三个博客是Code

python进阶强化学习

最近学习了慕课的python进阶强化训练,将学习的内容记录到这里,同时也增加了很多相关知识. 主要分为以下九个模块: 基本使用 迭代器和生成器 字符串 文件IO操作 自定义类和类的继承 函数装饰器和类的装饰器 进程和线程 内存管理和垃圾回收机制 基本使用 基本的数据包括:list,tuple(元组),set(集合)和dict(字典).heapq.queue 处理的实际问题是:过滤列表中的负数 解决方案: 列表解析,最好的方式 字典,使用字典的方式和使用列表的方式差不多,都是对value做判断,但

Python进阶(九)----os,sys,hashlib模块

Python进阶(九)----os,sys,hashlib模块 一丶序列化模块 什么是序列化: ? 将一种数据结构,转换成一个特殊的序列(特殊字符串,用于网络传输,或文件保存) ? 真正的意义:变量从内存中变成可存储或传输的过程称之为序列化 json模块: ? 是所有语言公认的一种序列,最常用,支持的数据结构有限:"list(tuple), int .str ,bool,None,float." ### dumps ,loads : 主要网络传输 , 用于文件的读取. import j

Python进阶(十)----规范化格式目录, time模块, datatime模块,random模块,collection模块(python额外数据类型)

Python进阶(十)----规范化格式目录, time模块, datatime模块,random模块,collection模块(python额外数据类型) 一丶规范化格式目录 六个目录: #### 对某某项目进行一个标准化的开发,进行规范化. #bin : 启动项目程序的主入口 #conf : 项目的配置文件 #core : 主要逻辑(业务逻辑) #db : 存放数据() #lib : 辅助文件(存放公共的一些方法) #README : 项目文档说明 ? 二丶time模块(时间模块) 时间的三

Python进阶----pymysql的安装与使用,mysql数据库的备份和恢复,mysql的事务和锁

Python进阶----pymysql的安装与使用,mysql数据库的备份和恢复,mysql的事务和锁 一丶安装 pip install PyMySQL 二丶pymysql连接数据库 ### 语法: import pymysql # 导入py模块 conn= pymysql.connect("数据库ip","用户","密码","数据库" ) # 打开数据库连接 cursor.execute("SELECT VERSI

Python 进阶 笔记

慕课网 Python 进阶 http://www.imooc.com/learn/317 笔记 # start: pass # 定义Person类的__init__方法,除了接受 name.gender 和 birth 外,还可接受任意关键字参数,并把他们都作为属性赋值给实例: class Person(object): count = 0 #定义类属性    def __init__(self, name, gender, birth, **kw):        self.name = na