• python之递归


    一、解释

    递归:在调用一个函数的过程中,直接或间接地调用了函数本身这个就叫递归

    :Python在递归中没有像别的语言对递归进行优化,所以他的每一次调用都会基于上一次的调用进行,并且他设置了最大的递归数量防止递归外溢

    即递归不同于死循环,有最多次数限制999次,到达最多次数时报错

    递归函数特性:

    
    
    1. 必须有一个明确的结束条件;
    2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减少
    3. 相邻两次重复之间有紧密的联系,前一次要为后一次做准备(通常前一次的输出就作为后一次的输入)。
    4. 递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)
    5. 递归函数的优点是定义简单,逻辑清晰。理论上,所有的递归函数都可以写成循环的方式,但循环的逻辑不如递归清晰。


    间接或直接调用自身的函数被称为递归函数。
    间接:
    def func():
        otherfunc()
    
    def otherfunc():
        func()
    
    直接:
    def func():
        func()
    
    
    count=0
    def abc():
        global count
        count+=1
        print(count)
        print('abc')
        abc()
    abc() 
    
    # 当达到999次时,会报错
    #RecursionError: maximum recursion depth exceeded while calling a Python object

    二、常见的递归实现

    #递归实现n个斐波那契数列:
    def fibonacci(n):
        if n == 0:
            return 0
        elif n == 1:
            return 1
        else:
            return fibonacci(n-1) + fibonacci(n-2)
    print([fibonacci(x) for x in range(10)])
    
    #输出:
    [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
    #返回n以内所有数的阶乘的和:
    def fn(n):
        if n == 1:
            return 1
        else:
            return n * fn(n - 1)
    print(sum(map(fn, range(1, 10))))
    
    #输出:409113
    #求一个数的质因数
    def zhiyinshu(n):
        for x in range(2, int(n/2+1)):
            if n % x == 0:
                l.append(x)
                return zhiyinshu(n/x)
        l.append(int(n))
        print(l)
    l = []
    zhiyinshu(90)
    
    #输出结果: [2, 3, 3, 5]
    计算1到100之间相加之和;通过循环和递归两种方式实现
    import sys
    def sum_cycle(n):
        '''
        1 to n,The sum function
        '''
        sum = 0
        for i in range(1,n + 1):
            sum += i
        return sum
    
    def sum_recu(n):
        '''
        1 to n,The sum function
        '''
        if n > 0:
            return n + sum_recu(n - 1) #调用函数自身
        else:
            return 0
    print("循环求和:",sum_cycle(100))  
    print("递归求和:",sum_recu(100))
    
    #输出结果:
    循环求和: 5050
    递归求和: 5050
     
  • 相关阅读:
    java构造方法和重写equals
    JVM,Java虚拟机基础知识新手入门教程(超级通熟易懂)
    ExtJS用Grid显示数据后如何自动选取第一条记录
    java 各种数据类型的互相转换
    提升思考力的8种日常训练法
    Java时间为什么从1970-01-01 00:00:00 000开始
    extjs计算两个DateField所间隔的月份(天数)
    如何快速理解他人代码,提高开发效率
    mybatis使用collection标签配置某个对象中的List集合类型的属性例子 <collection >
    将原有的Maven项目复制成另一个新名称的项目(包括:访问链接的时候也是使用的是新改的名称,而不是使用被复制项目的名称)
  • 原文地址:https://www.cnblogs.com/denise1108/p/10095326.html
Copyright © 2020-2023  润新知