python-5种阶乘方式


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

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM