前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >python巧妙实现数学阶乘n!

python巧妙实现数学阶乘n!

原创
作者头像
皮大大
发布于 2023-03-15 14:59:51
发布于 2023-03-15 14:59:51
97800
代码可运行
举报
运行总次数:0
代码可运行

公众号:尤而小屋 作者:Peter 编辑:Peter

大家好,我是Peter~

最近有个粉丝看了文章:python实现99乘法表,留言了一个问题:

你好,请问如何使用for i range语句来实现1!+2!+…+n!呢?

本文就给大家介绍如何使用python和第三方库来实现数学运算中的阶乘以及阶乘累计求和。

<!--MORE-->

python实现阶乘-基础版本

在数学运算中n!表示n的阶乘,用数学公式表示为:

$$n!=123(n-1)*n$$

下面提供了一个例子:比如5的阶乘

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
# 正确的结果

1*2*3*4*5

正确结果为:120

代码语言:txt
AI代码解释
复制
120

小编给大家提供3种不同的方法来实现阶乘运算:

  • 基于for运算的累乘
  • 基于递归函数实现
  • 基于第三方库functools的reduce函数实现

方式1-累乘

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
result = 1  # 给定一个初始值
n = 5

for i in range(1, n+1):
    print("累乘前result: ", result)
    print("循环数i的值: ", i)
    result = result * i  # 不断地累成result
    print("累乘后result: ", result)
    print("------------")

result
代码语言:txt
AI代码解释
复制
累乘前result:  1
代码语言:txt
AI代码解释
复制
循环数i的值:  1
代码语言:txt
AI代码解释
复制
累乘后result:  1
代码语言:txt
AI代码解释
复制
------------
代码语言:txt
AI代码解释
复制
累乘前result:  1
代码语言:txt
AI代码解释
复制
循环数i的值:  2
代码语言:txt
AI代码解释
复制
累乘后result:  2
代码语言:txt
AI代码解释
复制
------------
代码语言:txt
AI代码解释
复制
累乘前result:  2
代码语言:txt
AI代码解释
复制
循环数i的值:  3
代码语言:txt
AI代码解释
复制
累乘后result:  6
代码语言:txt
AI代码解释
复制
------------
代码语言:txt
AI代码解释
复制
累乘前result:  6
代码语言:txt
AI代码解释
复制
循环数i的值:  4
代码语言:txt
AI代码解释
复制
累乘后result:  24
代码语言:txt
AI代码解释
复制
------------
代码语言:txt
AI代码解释
复制
累乘前result:  24
代码语言:txt
AI代码解释
复制
循环数i的值:  5
代码语言:txt
AI代码解释
复制
累乘后result:  120
代码语言:txt
AI代码解释
复制
------------
代码语言:txt
AI代码解释
复制
120

方式2-使用递归

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
def recursion(n):
    if n == 0 or n == 1:  # 特殊情况
        return 1
    else:
        return n * recursion(n-1)  # 递归函数
代码语言:python
代码运行次数:0
运行
AI代码解释
复制
recursion(5)
代码语言:txt
AI代码解释
复制
120

方式3-第三方库functools的reduce函数

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
# 在python3中reduce函数被移入到functools中;不再是内置函数

from functools import reduce 

n = 5

reduce(lambda x,y: x*y, range(1,n+1))  
代码语言:txt
AI代码解释
复制
120

reduce函数的用法解释:

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
reduce(function, iterable[, initializer])
  1. 需要给定一个待执行的函数function(上面是匿名函数;或者自定义函数)
  2. 给定一个可迭代对象iterable
  3. 可选的初始值initializer
代码语言:python
代码运行次数:0
运行
AI代码解释
复制
# 使用自定义函数

from functools import reduce 

number = range(1,6)
# number = [1,2,3,4,5]

def add(x,y):
    return x+y

reduce(add, number)  # 1+2+3+4+5
代码语言:txt
AI代码解释
复制
15
代码语言:python
代码运行次数:0
运行
AI代码解释
复制
# 使用匿名函数

from functools import reduce 

number = range(1,6)

reduce(lambda x,y: x+y, number)  # 1+2+3+4+5
代码语言:txt
AI代码解释
复制
15

python实现阶乘累加求和-进阶版

下面是一个进阶的需求:如何实现阶乘的累加求和?

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
# 求出下面的阶乘的累加求和

1 + 1*2 + 1*2*3 + 1*2*3*4 + 1*2*3*4*5

正确结果是153

代码语言:txt
AI代码解释
复制
153

方式1-累乘+sum

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
# 定义累乘函数

def func(n):
    result = 1
    
    for i in range(1, n+1):
        result = result * i  # 不断地累成re
          
    return result
    
func(5)  # 测试案例
代码语言:txt
AI代码解释
复制
120

上面是我们实现的单个数字的阶乘,放入for即可求累计求和:

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
# func(1) + func(2) + func(3) +  func(4) + func(5)

# 调用累乘函数
sum(func(i)  for i in range(1,6))
代码语言:txt
AI代码解释
复制
153

方式2-累乘+递归

在一个函数中同时使用累乘和递归函数

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
# 定义累乘函数

def func(n):
    result = 1  # 定义初始值
    
    for i in range(1, n+1):
        result = result * i  # 不断地累成re
    
    # if result == 1 :  等价于下面的条件
    if n==0 or n==1:
        return 1
    else:
        return result + func(n-1)  #在这里实现递归 func(n-1)
    
func(5)  
代码语言:txt
AI代码解释
复制
153

方式3-递归+sum

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
def recursion(n):
    """
    之前定义的递归函数
    """
    if n == 0 or n == 1:
        return 1
    else:
        return n * recursion(n-1)  

调用递归函数在基于for循环和sum求和

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
# recursion(1) + recursion(2) + recursion(3) +  recursion(4) + recursion(5)

# 调用定义的递归函数
sum(recursion(i)  for i in range(1,6))
代码语言:txt
AI代码解释
复制
153

方式4-reduce 结合 sum

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
from functools import reduce 

n = 5

reduce(lambda x,y: x*y, range(1,n+1))  
代码语言:txt
AI代码解释
复制
120

单次调用reduce函数,结合for循环和sum求和

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
sum(reduce(lambda x,y: x*y, range(1,n+1)) for n in range(1,6))
代码语言:txt
AI代码解释
复制
153

方式5-两次reduce函数

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
[reduce(lambda x,y: x*y, range(1,n+1)) for n in range(1,6)]
代码语言:txt
AI代码解释
复制
[1, 2, 6, 24, 120]

将上面的结果作为可迭代的列表再次传入reduce函数,此时的执行函数是两个元素的求和(x+y):

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
reduce(lambda x,y:x+y, [reduce(lambda x,y: x*y, range(1,n+1)) for n in range(1,6)] )
代码语言:txt
AI代码解释
复制
153

所以,你学会了?

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Python计算整数阶乘的几种方法比较
问题本身很简单,主要是通过这个小问题来演示Python的一些用法,例如测试代码运行时间、函数嵌套定义等等。 from time import time from math import factorial from functools import reduce from random import randint def myFactorial1(n): '''使用传统方法计算阶乘''' result = 1 for i in range(1, n+1): result = r
Python小屋屋主
2018/04/16
3K0
开源图书《Python完全自学教程》7.5递归
在7.1.2节编写斐波那契数列函数的时候,使用了 Python 中的递归(Recursion)。固然 Python 创始人对递归有个人的看法,此处还是要用单独一节专门给予介绍。等读者阅读完本节内容,也能理解之所以如此重视递归的原因了。
老齐
2022/07/06
1.2K0
开源图书《Python完全自学教程》7.5递归
Python基础教程
星号只在 定义函数(允许使用不定数目的参数)或者 调用(“分割”字典或者序列)时才有用。
py3study
2020/01/03
7740
python小代码之阶乘求和
阶乘:也是数学里的一种术语;阶乘指从1乘以2乘以3乘以4一直乘到所要求的数;在表达阶乘时,就使用“!”来表示。如h阶乘,就表示为h!;阶乘一般很难计算,因为积都很大。
py3study
2020/01/10
2.3K0
【从零学习python 】30.深入理解递归函数和匿名函数
看阶乘的规律 1! = 1 2! = 2 × 1 = 2 × 1! 3! = 3 × 2 × 1 = 3 × 2! 4! = 4 × 3 × 2 × 1 = 4 × 3! … n! = n × (n-1)!
全栈若城
2024/02/29
1090
【从零学习python 】30.深入理解递归函数和匿名函数
Python应用之计算阶乘
当 m 是自然数时,表示不超过 m 且与 m 有相同奇偶性的所有正整数的乘积。如:
芯动大师
2022/11/15
1.7K0
Python应用之计算阶乘
Python基础10-函数的递归
-多年互联网运维工作经验,曾负责过大规模集群架构自动化运维管理工作。 -擅长Web集群架构与自动化运维,曾负责国内某大型金融公司运维工作。 -devops项目经理兼DBA。 -开发过一套自动化运维平台(功能如下): 1)整合了各个公有云API,自主创建云主机。 2)ELK自动化收集日志功能。 3)Saltstack自动化运维统一配置管理工具。 4)Git、Jenkins自动化代码上线及自动化测试平台。 5)堡垒机,连接Linux、Windows平台及日志审计。 6)SQL执行及审批流程。 7)慢查询日志分析web界面。
DriverZeng
2022/09/26
2310
Python基础10-函数的递归
老男孩Python全栈开发(92天全)视频教程 自学笔记15
day15课程内容:   高阶函数   1、函数名可以进行赋值   2、函数名可以作为参数,也可以作为函数的返回值 def f(): print("高阶函数") def bar(a,b,c): c() print("高阶函数%s%s"%(a,b)) bar(1,1,f) # 高阶函数 # 高阶函数11 ############### def f1(n): print("高阶函数调用%s"%n) return n*n def bar1(a,b,c): d=c(a
玩蛇的胖纸
2018/06/08
5990
快速阶乘算法python_【最全】阶乘算法!(python和C语言)
叁岁学编程:用最简单的大白话理解编程,欢迎大家关注,留言,提问,希望和大家一起提升!
全栈程序员站长
2022/09/15
1.5K0
Python第四课----函数
2、调用 函数定义,只是声明,不会执行,需要调用 加上小括号调用 调用时写的参数是实际参数,是传入的值,简称实参
py3study
2020/01/14
5140
【Python篇】Python 函数综合指南——从基础到高阶
在 Python 中,函数是构建程序的一个重要部分,它允许你封装逻辑并高效地重用代码。函数是组织良好的、可重复使用的代码块,用于执行单一的、相关的操作。函数为的应用提供了更好的模块化能力,并提高了代码的重用性。
半截诗
2024/10/09
4200
7-函数
当存在多个默认参数的时候,调用的时候,既可以按顺序提供默认参数,比如调用enroll('Bob', 'M', 7),意思是,除了name,gender这两个参数外,最后1个参数应用在参数age上,city参数由于没有提供,仍然使用默认值。
用户3106371
2019/03/11
7400
7-函数
Python函数进阶:探索高级函数特性与技巧
Python中的函数不仅仅是一段可重用的代码块,还具备强大的进阶特性,如函数装饰器、匿名函数、闭包、生成器、递归等。本文将深入探讨Python函数的高级特性与技巧,以帮助你更好地编写清晰、灵活和高效的代码。
海拥
2023/09/19
5190
Python函数进阶:探索高级函数特性与技巧
Python3.0科学计算学习之函数
函数允许程序的控制在不同的代码片段之间切换,函数的重要意义在于可以在程序中清晰地分离不同的任务,将复杂的问题分解为几个相对简单的子问题,并逐个解决。即“分而治之”。
py3study
2020/01/16
1.3K0
Python3.0科学计算学习之函数
python-内置函数(搭配lambda使用)
目录 常用的内置函数 需要注意的知识点: enumerate()函数 map()函数 zip()函数 filter()函数 reduce()函数 sum()函数 max()/ min()函数 sort()函数 sorted()函数 内置函数一览表: 常用的内置函数 学习! 需要注意的知识点: 大部分内置函数经常搭配lambda函数使用 可迭代对象:字符串、列表、元组、字典、集合、文件对象 注意!!!! 在py3中部分函数的返回值是一个迭代器,不能多次遍历,(map、filter、z
HammerZe
2022/03/25
6760
python-内置函数(搭配lambda使用)
【深度学习】 Python 和 NumPy 系列教程(七):Python函数(基础知识、模块、n种不同形式的函数)
Python本身是一种伟大的通用编程语言,在一些流行的库(numpy,scipy,matplotlib)的帮助下,成为了科学计算的强大环境。本系列将介绍Python编程语言和使用Python进行科学计算的方法,主要包含以下内容:
Qomolangma
2024/07/29
1120
【深度学习】 Python 和 NumPy 系列教程(七):Python函数(基础知识、模块、n种不同形式的函数)
python 几个重要函数
lambda argument1, argument2,...,argumentN: expression using arguments
py3study
2020/01/08
6260
Python3学习笔记 | 二十一、Python的函数-函数的高级话题
当我们使用函数时,就开始面对如何将组件组合在一起的选择。例如,如何将任务分解成为更有针对性的函数(导致了聚合性),函数将如何通讯(耦合性)等。我们要深入考虑函数的大小概念,因为它们直接影响到代码的可用性。 耦合性:对于输入使用参数并且对于输出使用return语句。 耦合性:只有真正必要的情况下使用全局变量。 耦合性:不要改变可变类型的参数,除非调用者希望这么做。 聚合性:每一个函数都应该有一个单一的、统一的目标。 大小:每一个函数应该相对较小。 耦合性:避免直接改变在另一个模块文件中的变量。
TeamsSix
2019/09/24
5300
Python3学习笔记 | 二十一、Python的函数-函数的高级话题
5.python函数
函数介绍 定义:  函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可。 特性:减少重复代码、使程序变的可扩展、使程序变得易维护  1.普通参数 def func(name): #name是形式参数 print(name) #函数体 func('derek') #执行函数,'derek'是传入的实参 2.默认参数 定义了默认参数后,在函数调用时不需要再传入,默认参数放在最后面 def info(name,age,countr
zhang_derek
2018/04/11
6610
Python面试题之Python中的lambda map filter reduce zip
map()将函数func应用于序列seq中的所有元素。在Python3之前,map()返回一个列表,列表中的每个元素都是将列表或元组“seq”中的相应元素传入函数func返回的结果。Python 3中map()返回一个迭代器。
Jetpropelledsnake21
2019/02/15
1.2K0
推荐阅读
相关推荐
Python计算整数阶乘的几种方法比较
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文