写点什么

Python 应用之计算阶乘

作者:向阳逐梦
  • 2022 年 10 月 02 日
    四川
  • 本文字数:1973 字

    阅读完需:约 6 分钟

1.背景知识

阶乘是基斯顿·卡曼(Christian Kramp,1760~1826)于 1808 年发明的运算符号。一个正整数的阶乘(factorial)是所有小于及等于该数的正整数的积,通俗的讲也就是按顺序从 1 乘到 n,所得的那个数就是 n 的阶乘。0 的阶乘为 1,自然数 n 的阶乘写作 n!。即:0!= 11!= 12!= 2 × 1!= 2 × 13!= 3 × 2!= 3 × 2 × 1n!= n × (n - 1)!= n × (n - 1) × (n - 2) ×...× 2 × 1

输入一个整数 n,求其阶乘 n!


1.1 双阶乘

双阶乘用“m!!”表示。

当 m 是自然数时,表示不超过 m 且与 m 有相同奇偶性的所有正整数的乘积。如:

当 m 是负奇数时,表示绝对值小于它的绝对值的所有负奇数的绝对值积的倒数。

当 m 是负偶数时,m!!不存在。

自然数双阶乘比的极限

阶乘的逼近函数公式

对于正整数


2.如何解题

  • 用 input 函数请用户输入一个整数,因为负数无阶乘,需使用户输入的数为自然数

  • 根据阶乘的特点:n!= n × (n - 1)!= n × (n - 1) × (n - 2) ×...× 2 × 1,可用 for 循环、递归等方法求解

  • 需考虑特殊情况:0!= 1

3.解题方法

方法一:for 循环

a = int(input('请输入一个自然数:'))result = 1if a < 0:    print('负数没有阶乘')elif a == 0:    print('0的阶乘为1')else:    for i in range(1, a + 1):        result *= i    print(f"{a}的阶乘为{result}")
复制代码

第 1 行: 定义变量 a,用 input 函数使用户输入数字,int 函数将其转换为整型

第 2 行: 创建一个存储阶乘运算结果的变量 result,变量初始值为 1

第 3-10 行: 用 if...elif...else 语句对用户输入的数值进行判断。若用户输入的数值小于 0,输出“负数没有阶乘”;若用户输入的数值等于 0,输出“0 的阶乘为 1”;否则用 for 循环遍历 1 至 a 的整数,在每轮循环中,result 都会与循环变量 i 相乘并将乘积结果再赋值给 result,当 for 循环结束时,result 的值就是自然数 n 阶乘的运算结果,最后用 print 函数输出阶乘结果。

方法二: 递归法

def factorial(n):    assert n >= 0, "请输入自然数"    if n == 0:        return 1    return n * factorial(n - 1)

a = int(input('请输入一个自然数:'))print(factorial(a))
复制代码

第 1 行: 定义函数 factorial,传入参数 n

第 2 行: 用 assert 断言函数限定参数 n 大于或等于 0,若大于或等于 0,执行后面的代码,否则报错“AssertionError: 请输入自然数!​

第 3-5 行: 设定递归的结束条件,当 n 为 0 时,返回值为 1,否则返回值为 n * factorial(n - 1)

第 8 行: 定义变量 a,用 input 函数使用户输入数字,int 函数将其转换为整型

第 9 行: 为参数 n 赋值为 a,用 print 函数打印计算结果

方法三: reduce()函数

from functools import reduce

def factorial(n): assert n >= 0, "请输入自然数" if n == 0: return 1 return reduce(lambda x, y: x * y, range(1, n + 1))

a = int(input('请输入一个自然数:'))print(factorial(a))
复制代码

第 1 行: 从 functools 模块中导入 reduce()函数

第 4 行: 定义函数 factorial,传入参数 n

第 5 行: 用 assert 断言函数限定参数 n 大于或等于 0,若大于或等于 0,执行后面的代码,否则报错“AssertionError: 请输入自然数!”

第 6-7 行: 设定递归的结束条件,当 n 为 0 时,返回值为 1

第 8 行: 调用 reduce 函数,使用 lambda 表达式输出前 n 项的积

第 11 行: 定义变量 a,用 input 函数使用户输入数字,int 函数将其转换为整型

第 12 行: 为参数 n 赋值为 a,用 print 函数打印计算结果​

educe() 函数

reduce() 函数是 functools 模块中的一个函数,其作用是对参数序列中元素进行累积。

语法:reduce(function, iterable[, initializer])

参数说明:function:是包含两个参数的函数 iterable :可迭代对象 initializer :初始参数

def prod(x, y):        return x + yprint(reduce(prod, [1, 2, 3, 4, 5]))  # 15
复制代码

函数 prod 有两个参数 x 和 y,迭代对象是[1,2,3,4,5],计算过程为((((1+2)+3)+4)+5),在函数 function 的两个参数中,左边的参数 x 是被累积的值,而右边的参数 y 是依次从序列中获取的值。可以使用 lambda 表达式来简化代码:

print(reduce(lambda x, y: x + y, [1, 2, 3, 4, 5]))   # 15
复制代码

lambda 表达式

Lambda 函数是 Python 中的匿名函数,也就是没有具体名称的函数,通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用 。​

lambda 表达式的两个要点:

  • lambda 表达式必须使用 lambda 关键字定义。

    在 lambda 关键字之后、冒号左边为参数列表,可不带参数,也可有多个参数。若有多个参数,则参数间用逗号隔开,冒号右边为 lambda 表达式的返回值。

方法四: factorial()函数

import matha = int(input('请输入一个自然数:'))result = math.factorial(a)print(f"{a}的阶乘为{result}")
复制代码

第 1 行: 导入模块 math

第 2 行: 定义变量 a,用 input 函数使用户输入数字,int 函数将其转换为整型

第 3 行: 创建变量 result,调用 math 模块中的 factorial 函数,传入参数 a

第 4 行: print 函数输出结果

发布于: 刚刚阅读数: 4
用户头像

向阳逐梦

关注

人生享受编程,编程造就人生! 2022.06.01 加入

InfoQ签约作者、阿里云“乘风者计划”签约博主

评论

发布
暂无评论
Python应用之计算阶乘_函数_向阳逐梦_InfoQ写作社区