递归函数推导
引子:
今天搬家了,距离变的近了,开始复习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) 中的值 以此类推 就可以拿到结果