匿名/递归函数

1.匿名函数

lambda x,y:x*y                 #同一行定义匿名函数
print(lambda x,y:x*y)
a=lambda x,y:x*y               #定义匿名函数并赋值给a
print(a(2,3))

执行结果

<function <lambda> at 0x00000266C4C51820>
6

2.递归函数

自己调用自己实现递归算法,理论上作用可完全取代循环
def recursion_sum(num):
    if num==1:                          #最小分解到1
        return  num
    return recursion_sum(num-1)+num     #自己调用自己
print(recursion_sum(10))

执行结果55

循环实现过程

def sum1(num):
    i=1
    add=0
    while i<=num:
        add=add+i
        i+=1
    return add
print(sum1(10))

3.递归运行原理

递归一次,在内存中开辟一个新的地址空间
记录递归过程状态,一直递归分解到最小范围
最后分解到最小范围,最后得出要么找到对应的值,要么返回找不到的结果
def recursion_sum(num):
    if num== 1 :                                  #最小分解到1
        return num
    tt=recursion_sum(num-1)+num
    print('第%d次递归'%(num))
    print('返回值%d在内存中地址:%d'%(tt,id(tt)))   #追踪变量地质变化
    return tt                                    #返回递归结果

print(recursion_sum(5))

执行结果

第2次递归
返回值3在内存中地址:140732516194016
第3次递归
返回值6在内存中地址:140732516194112
第4次递归
返回值10在内存中地址:140732516194240
第5次递归
返回值15在内存中地址:140732516194400
15

递归算法其实是栈的调用过程,递归一次就进栈一次,返回一次,出栈一次

递归实现二分法查找

def find_num(nums,find,left,right):
    middle=int((left+right)/2)          #求商的整数,取中间值的下标
    if nums[middle]==find:                      #找到列表中的值
        return middle
    if right==left+1:                     #若指定范围内只有一个未找元素
        if nums[middle]!=find:            #而且没有找到
            return -1                     #返回-1  -1代表没找到
    if nums[middle]>find:
        return find_num(nums,find,left,middle)               #值的范围在[left,right)之间    
    elif nums[middle]<find:
        return find_num(nums,find,middle+1,right)           #值的范围在(middle,right]之间

nums=[1,2,3,4,5,6,8,16,30,42,55]
print(find_num(nums, 16, 0,len(nums)))

执行结果7

优点:有限陈述定义无限对象集合的可能性

缺点:内存空间压力逐渐增大

上一篇:LeetCode33旋转排序数组的二分查找


下一篇:Vue 监听鼠标左键 鼠标右键以及鼠标中键修饰符click.left&contextmenu&click.middle