zoukankan      html  css  js  c++  java
  • Python学习---递归函数的学习

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

    递归特性:

    1. 必须有一个明确的结束条件

    2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减少

    3. 递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返     回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出。)

    实例1:  (阶乘)

    # 普通方法
    def factorial(num):
        fac = num
        for i in range(1, num):
            fac *= i
        return fac
    print(factorial(4))
    
    # 递归实现
    def factorial(num):
       if num == 1:                     # 结束条件
            return 1
       return factorial(num - 1) * num
    print(factorial(4))
    
    
    # 函数式编程实现:
    from functools import reduce
    print (reduce(lambda x,y: x*y, range(1,5)))  # 24

    实例2:斐波那契数列

    # 普通实现:
    # 0 1 1 2 3 5 8 13
    def fibo(n):
        before = 0
        after = 1
        ret = 0
        for i in range(n - 1):
            ret = before + after
            before = after
            after = ret
        return ret
    print(fibo(6))                 # 8
    
    # 递归实现:
    # 0 1 1 2 3 5 8 13
    def fibo_new(n):  # n可以为零,数列有[0]
        if n <= 1:            # 结束条件   f(0)=0,f(1)=1,f(2)=f(1)+f(0)-->符合return条件,所以<=1
            return n
        return (fibo_new(n - 1) + fibo_new(n - 2))   # f(8) = f(7) + f(6)
    print(fibo_new(6))                  #  8
    
    # 其他实现
    def fib(max):
        n, b, a = 0, 0, 1
        while n < max:
            print(b)
            b, a = a, b+a  # 赋值是同时执行的
            n += 1
    fib(6)   # 8

     

    实例3:求number =[2, -5, 9, -7, 2, 5, 4, -1, 0, -3, 8]中的正数的平均值

    # 递归实现
    number = [2, -5, 9, -7, 2, 5, 4, -1, 0, -3, 8]
    count = 0
    li = []
    for i in range(len(number)):
        if number[i] > 0:
            li.append(number[i])
            count += 1
    count = str(count)
    print("%s个正整数的和为%d" % (count, sum(li)))
    
    # 函数式编程

    # 待写

  • 相关阅读:
    象棋中马的遍历
    字符串压缩
    寻找丑数
    Educoder
    Educoder
    以太坊:EVM的存储结构
    以太坊:EVM执行字节码的过程
    以太坊:底层序列化编码方式RLP
    以太坊:在合约里调用指定地址的另一已部署合约
    以太坊:创建合约
  • 原文地址:https://www.cnblogs.com/ftl1012/p/9382607.html
Copyright © 2011-2022 走看看