zoukankan      html  css  js  c++  java
  • python的递归

    1、递归的特点

    递归算法是一种直接或间接调用自身算法的过程,在计算机编程中,递归算法对解决一大类问题是十分,它往往使算法的描述简洁而且易于理解。

    递归算法解决问题的特点:

    (1)递归就是在过程或函数里调用自身

    (2)在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。

    (3)递归算法解题通常显得很简洁,但递归算法解题的运行效率较低,所以一般不提倡用递归算法设计程序。

    (4)在递归调用的过程中系统为每一层的返回点、局部量等开辟了栈来存储,递归次数过多容易造成栈溢出等。

    2、递归的要求

    递归算法所体现的“重复”一般有三个要求:

    (1)每次调用在规模上都有所缩小(通常是减半)

    (2)是相邻两次重复之间有紧密的联系,前一次要为后一次做准备(通常前一次的输出作为后一次的输入)

    (3)在问题的规模极小时必须用直接给出解答而不再进行递归调用,因而每次递归调用都是有条件的(以规模位达到直接解答的大小为条件)无条件递归调用将会成为死循环而不能正常结束。

    3、递归实例

    #递归就是函数自己调用自己
    # count = 0
    # def abc():
    #     global count
    #     count+=1
    #     print('abc')
    #     print(count)
    #     return abc()#函数自己调用自己,递归一定要有结束条件,输入错误的时候,可以继续往下输入,会重新调用
    # #循环效率比递归效率高
    # abc()#报错,超过最大的递归次数,不同于死循环,最大限制次数,最多999
    #递归实现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
    #计算1到100之间相加之和;通过循环和递归两种方式实现
    
    def sum_cycle(n):
        '''
    to n,The sum function
        '''
        sum = 0
        for i in range(1,n + 1):
            sum += i
        return sum
    
    def sum_recu(n):
        '''
    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
    def func1(n):
        "打印100以内的奇数"
        if n <= 100:
            print(n)
            n += 2
            return func1(n)
    func1(1)
    #求一个数的质因数
    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(100)
  • 相关阅读:
    Linux中hadoop配置hdfs
    linux安装配置hadoop
    Linux配置Tomcat
    虚拟机jdk(在profile.d中)配置
    SSH免密登录
    Linux配置MySQL
    虚拟机jdk(profile)配置
    解释器模式实例分析
    第七天
    第六天
  • 原文地址:https://www.cnblogs.com/blueteer/p/10097072.html
Copyright © 2011-2022 走看看