zoukankan      html  css  js  c++  java
  • python(22)- 递归和函数式编程

    递归:

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

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

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

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

    age(5)=age(4)+2
    age(4)=age(3)+2
    age(3)=age(2)+2
    age(2)=age(1)+2
    age(1)=10
    n==1    age(n)=10
    n>1     age(n)=age(n-1)+2
    

    递归方法实现

    def age(n):
        if n==1:
            return 10
        else:
            return age(n-1)+2
    
    print(age(5))
    ---->18
    

     

    递归函数格式

    def func(n):
        if n == 10:
            return
        print('from func')
        func(n-1)
    
    func(10)
    

    递归效率低,python3中栈默认次数为1000次,可以设栈的次数

    import sys
    sys.setrecursionlimit(10000)
    

    递归函数应用

    用二分法查看整型在不在data列表中
    
    data = [1, 3, 6, 7, 9, 12, 14, 16, 17, 18, 20, 21, 22, 23, 30, 32, 33, 35]
    

    程序如下

    data = [1, 3, 6, 7, 9, 12, 14, 16, 17, 18, 20, 21, 22, 23, 30, 32, 33, 35]
    def search(num,data):
        print(data)
        mid_index=int(len(data)/2)
        mid_value=data[mid_index]
        if num>mid_value:   #num在data中值右侧
            data=data[mid_index:]
            return search(num,data)
        elif num<mid_value:   # num在data中值右侧
            data=data[:mid_index]
            return search(num, data)
        else:
            print("find it!")
    
    search(35,data)
    --->[1, 3, 6, 7, 9, 12, 14, 16, 17, 18, 20, 21, 22, 23, 30, 32, 33, 35]
        [18, 20, 21, 22, 23, 30, 32, 33, 35]
        [23, 30, 32, 33, 35]
        [32, 33, 35]
        [33, 35]
        find it!
    
    search(3,data) 
    --->[1, 3, 6, 7, 9, 12, 14, 16, 17, 18, 20, 21, 22, 23, 30, 32, 33, 35]
        [1, 3, 6, 7, 9, 12, 14, 16, 17]
        [1, 3, 6, 7]
        [1, 3]
        find it!
    
    search(19,data) 
    ---->报错,一直在寻找19,查了1000次后栈满,所以报错
    

    程序优化版

    data = [1, 3, 6, 7, 9, 12, 14, 16, 17, 18, 20, 21, 22, 23, 30, 32, 33, 35]
    def search(num,data):
        print(data)
        if len(data) > 1:
            mid_index=int(len(data)/2)
            mid_value=data[mid_index]
            if num>mid_value:   #num在data中值右侧
                data=data[mid_index:]
                return search(num,data)
            elif num<mid_value:   # num在data中值右侧
                data=data[:mid_index]
                return search(num, data)
            else:
                print("find it!")
        else:
            if data[0]==num:
                print("find it!")
            else:
                print(num,"不在data列表中")
    
    search(19,data)
    ---->[1, 3, 6, 7, 9, 12, 14, 16, 17, 18, 20, 21, 22, 23, 30, 32, 33, 35]
        [18, 20, 21, 22, 23, 30, 32, 33, 35]
        [18, 20, 21, 22]
        [18, 20]
        [18]
        19 不在data列表中
    

      

    函数式编程:

    1.不会修改外部状态

    2.函数式编程语言非常精简,可读性比较差

    3.模仿数学意义上的函数编程

    高阶函数:map , reduce ,filter,sorted

    能把函数作为参数传入,这样的函数就称为高阶函数。

    匿名函数:  lambda

    面向过程编程:我们通过把大段代码拆成函数,通过一层一层的函数,可以把复杂的任务分解成简单的任务,这种一步一步的分解可以称之为面向过程的程序设计。函数就是面向过程的程序设计的基本单元。

    函数式编程:是使用一系列函数去解决问题,函数式编程就是根据编程的范式来,得出想要的结果,只要是输入时确定的,输出就是确定的。

  • 相关阅读:
    自动化测试用例设计实例
    day07 python2与python3 编码
    day06-2 数据结构
    遇到一个关于C#调用Microsoft.Office.Interop.Word实例化的一个问题
    关于C#调用matlab生成的dll的一些经验(亲测)
    javascript 检测浏览类型和版本
    图片自适应完美兼容IE8
    Java VS .NET:Java与.NET的特点对比
    【C#点滴记录】ASP.NET 使用C# 导出Word 和Excel
    关于现在IT行业从业者一些建议
  • 原文地址:https://www.cnblogs.com/xuyaping/p/6709577.html
Copyright © 2011-2022 走看看