递归函数推导

引子:

  今天搬家了,距离变的近了,开始复习python,一些基础的东西都快忘记了

代码:

def facorials(n):
    return 1 if n<2 else n*facorials(n-1)

face=facorials
a=list(map(face,range(11)))
print(a)


打印结果
[1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800]

  

推导过程:

  以上的facorials函数等同于

def facrotial(a):
     if a<2:
         return 1
     elif a>=2:
         return facrotial(a-1)*a

  明显是一个递归函数,range(11)返回一个0-10的生成器,这也是py2和py3的区别,py2是返回的一个列表,py3对它做了优化。此递归函数的推导过程如下

# def facrotial(a):
#     if a<2:
#         return 1
#     elif a>=2:
#         return facrotial(a-1)*a


facrotial(4)


# a=4时,明显走elif
# def facrotial(4):
#     if a<2:
#         return 1
#     elif a>=2:
#         return facrotial(4-1)*4=====>facrotial(3)*4


#a=3时,还是走elif
# def facrotial(3):
#     if a<2:
#         return 1
#     elif a>=2:
#         return facrotial(3-1)*4=====>facrotial(2)*3

#a=2时,还是走elif
# def facrotial(2):
#     if a<2:
#         return 1
#     elif a>=2:
#         return facrotial(2-1)*2=====>facrotial(1)*2


当a=1的时候,会走if 此时返回值是1
# def facrotial(1):
#     if a<2:
#         return 1
#     elif a>=2:
#         return facrotial(a-1)*a


所以:
facrotial(1)=1
facrotial(2)=facrotial(1)*2
facrotial(3)=facrotial(2)*3
facrotial(4)=facrotial(3)*2


filer和map

filer 只是筛选并不改变原有对象的值,个数因为筛选的原因可能发生变化
map 原有对象的元素个数不变,但是值可能会发生变化

  range(11) 中的值 以此类推 就可以拿到结果

 

posted @ 2020-11-10 22:46  Yuan_x  阅读(318)  评论(0编辑  收藏  举报