n的阶乘,就是从1到n,这些数相乘的积。
如果用python来实现,有很多种方式,今天介绍3种主要方式,分别为遍历,递归和内置函数。
其中遍历分为正序遍历和倒序遍历,递归分为普通递归和尾递归,内置函数则使用reduce。
一、正序遍历
正序遍历,即从1依次遍历到n,遍历的过程中进行求积,最终得到结果。
定义一个函数positive,接收一个入参num,函数目的是打印出该数的阶乘
def positive(num):
由于要进行求积操作,所以需要一个变量来存储积,初始值为1(因为1乘以任何数都等于任何数本身)
product = 1
从1到n,每个数都要参与运算,所以需要对num进行遍历
for i in range(num):
让product与每一项i进行相乘,然后赋值给product
product = product * (i+1)
遍历结束后,打印product
print(product)
代码如下:
1 def positive(num): 2 '''正乘 :从1乘到n''' 3 product = 1 4 for i in range(num): 5 product = product * (i+1) 6 print(product) 7 8 if __name__ == '__main__': 9 num = 6 10 positive(num)
二、倒序遍历
倒序遍历的思路与正序基本相同,不同点是从n乘到1
依旧是定义一个方法和存储积的变量product,初始值为1,对num进行遍历
def positive(num):
product = 1
for i in range(num):
如果要从n乘到1,则需要让num依次递减,因为i是逐渐增大,所以num-i会逐渐变小,从num减到1
product = product * (num-i)
最后打印product,代码如下:
1 def negative(num): 2 '''逆乘:从n乘到1''' 3 product = 1 4 for i in range(num): 5 product = product * (num-i) 6 print(product) 7 8 if __name__ == '__main__': 9 num = 6 10 negative(num)
三、递归
递归是方法的自调用,它的核心思想是,利用自我调用,直到满足得到具体数值的条件后,结束递归自调用,返回整体运算结果。
递归使得代码非常精简,但不易理解。整体思路是,先得到n*(n-1)!,(n-1)!又可拆为(n-1)*(n-2)!,(n-2)!又可拆为(n-2)*(n-3)!
首先定义一个方法recursion,接收一个入参num
def recursion(num):
该方法要返回一个乘法运算表达式,即num * (num-1)!,(num-1)!无法直接得到,需再次调用本函数,使得每次相乘都是该数乘以该数减一的连乘积
return num * recursion(num-1)
连续阶乘有了,怎么让连续阶乘结束呢,那么就需要添加一个得出具体数值的条件,即当入参num=0时,返回1
if num == 0:
return 1
这样,当入参num=0,初次调用函数时返回的表达式就是n*(n-1)*(n-2)*...*2*1,也就是n!
代码如下:
1 def recursion(num): 2 '''递归''' 3 if num == 0: 4 return 1 5 return num * recursion(num-1) 6 7 if __name__ == '__main__': 8 num = 6 9 print(recursion(num))
四、尾递归
尾递归的思想与递归基本相同,都是函数自调用,但区别在于递归返回的是数与函数之间进行的算术运算,尾递归是返回本函数,算术操作放在了参数中
依旧是先定义一个函数,但函数入参是2个参数,一个是要计算阶乘的数num,另一个是保存每次相乘的数值,参数名假设为acc,初始值为1
def tailrecursion(num, acc=1):
函数要返回本函数的调用,将num-1和num*acc作为入参再次调用,这样在每次调用函数时,就实现了乘积运算,且num在逐渐变小
return tailrecursion(num - 1, num * acc)
当num-1=0时,即入参的第一个参数为0,需停止自调用,返回数值acc,此时acc=num!
if num == 0:
return acc
代码如下:
1 def tailrecursion(num,acc=1): 2 '''尾递归''' 3 if num == 0: 4 return acc 5 return tailrecursion(num - 1, num * acc) 6 7 if __name__ == '__main__': 8 num = 6 9 print(tailrecursion(num))
五、内置函数reduce
reduce会按照运算规则,对列表中的元素依次进行运算
所以先定义一个求积的函数,我们直接使用匿名函数,两个入参x和y,返回x*y
lambda x, y : x * y
再定义一个从1到n的list,使用简化方式
i+1 for i in range(num)
使用reduce函数进行组合
result = reduce( lambda x, y : x * y, (i+1 for i in range(num)) )
代码如下:
1 if __name__ == '__main__': 2 num = 6 3 result = reduce(lambda x,y:x*y, (i+1 for i in range(num))) 4 print(result)
最终的结果都是720