Python 用六种方法实现 n 的阶乘

您所在的位置:网站首页 python定义一个求解阶乘的函数 Python 用六种方法实现 n 的阶乘

Python 用六种方法实现 n 的阶乘

2024-02-24 19:33| 来源: 网络整理| 查看: 265

首先从数学的定义原理上分析,n!的数学定义有两种:

                          

     阶乘是基斯顿·卡曼(Christian Kramp,1760~1826)于1808年发明的运算符号,是数学术语。一个正整数的阶乘(factorial)是所有小于及等于该数的正整数的积,并且0的阶乘为1。自然数n的阶乘写作n!。1808年,基斯顿·卡曼引进这个表示法。

亦即n!=1×2×3×...×n。阶乘亦可以递归方式定义:0!=1,n!=(n-1)!×n。

 

--> 这里就有了两种解法:1、是从 1 一直乘到 n ;2、0!=1,n!=(n-1)!×n 这是一种递归的定义,亦可以用递归函数来实现。

最简单的实现方法,即使用python自带的math模块里的factorial方法:

def Func3(n): from math import factorial if n >= 0: return factorial(n) else: print('出错')

# 整数的阶乘(英语:factorial)是所有小于及等于该数的正整数的积,0的阶乘为1。即:n!=1×2×3×...×n。所以这里可以直接使用factorial方法算出n 的阶乘。

 

使用定义0!= 1;n!= (n - 1)!* n来计算,这里很容易想到递归函数:

def Func0(n): if n == 0: return 1 elif n >= 1: return n * Func0(n - 1) else: print('出错') def Func1(n): _list = [] while True: if n > 0: _list.append(n) n -= 1 elif n == 0: _list.append(1) while len(_list) > 1: x_nub = _list[-1] * _list[-2] del _list[-1] del _list[-1] _list.append(x_nub) return _list[0] else: print('出错'); break

# Func0函数用了递归函数,Func1函数则解释了递归函数内部方法,详细见& https://blog.csdn.net/peipei12138/article/details/88927527

 

然后使用定义n!= 1*2*3*……*n,来计算:

def Func2(n): mul = lambda a, b: a * b from functools import reduce if n > 1: return reduce(mul, range(1, n + 1)) if n == 1 or n == 0: return 1 else: print('出错') def Func4(n): if n >= 1: return eval("*".join([str(i) for i in range(1, n + 1)])) elif n == 0: return 1 else: print('出错') def Func5(n): if n in (0,1): return 1 elif n > 1: in_num = n while n > 1: n -= 1 in_num *= n return in_num else: print('出错')

# Func2函数比较好理解,实现原理就是计算1*2*3*……*n,先计算1*2得到2,再用前面的得数乘后的 3 得到新的得数,反复到 n。这里的reduce函数就是实现这个操作的高阶函数。匿名函数 mul 实现两个数相乘,返回值作为结果。

# Func4函数,其思路是 n!相当于 1*2*3*……*n 这个式子,把它先完整的写下来,再交给python处理这个式子,eval函数里面的表达式就是用来输出1*2*3*……*n这样一个字符串的,eval函数则用来运行字符串里面的内容。

@ 它们俩的区别就在于Fac2是把多个项相乘变成了两个两个相乘,其中的reduce函数就有一种递归的思想;Fac4则是把多个项组成的式子全写了出来,然后一起交给程序做乘法。

# Func5是用while来求解的

 

当然 python 计算 n!的方法远远不止这么几种,这里主要提供一个思考方向供读者参考。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3