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

 

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

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

 

posted @ 2016-04-14 22:40  许二哈哈哈  阅读(426)  评论(0编辑  收藏  举报