阶乘
import math
def factorial(n):
if n == 0: return 1
if n == 1: return 1
if n == 2: return 2
return n * factorial(n-1)
def factorial_for(n):
if n == 0: return 1
if n == 1: return 1
if n == 2: return 2
x = 1
for i in range(1,n+1):
x *= i
return x
print([math.factorial(i) for i in range(0,5)])
print([factorial(i) for i in range(0,5)])
print([factorial_for(i) for i in range(0,5)])
结果如下
[1, 1, 2, 6, 24]
[1, 1, 2, 6, 24]
[1, 1, 2, 6, 24]
速度对比
import math
import time
def factorial_recur(n):
if n == 0: return 1
if n == 1: return 1
if n == 2: return 2
return n * factorial_recur(n-1)
def factorial_for(n):
if n == 0: return 1
if n == 1: return 1
if n == 2: return 2
x = 1
for i in range(1,n+1):
x *= i
return x
num = 100
T0 = time.time()
print(math.factorial(num))
print(time.time()-T0,'\n')
T1 = time.time()
print(factorial_recur(num))
print(time.time()-T1,'\n')
T2 = time.time()
print(factorial_for(num))
print(time.time()-T2)
结果如下
93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000
3.0040740966796875e-05
93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000
4.1961669921875e-05
93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000
2.3603439331054688e-05
e
import math
def factorial(n):
if n == 0: return 1
if n == 1: return 1
if n == 2: return 2
x = 1
for i in range(1,n+1): x *= i
return x
e = sum([1/factorial(i) for i in range(40)])
print(math.e)
print(e)
结果如下
2.718281828459045
2.7182818284590455
根号
import math
def sqrt(x):
if x == 0: return 0.0
if x == 1: return 1.0
left, right = 0, x
middle = (left+right) / 2
eps = 1e-13
eps_v = 1
while eps_v > eps:
eps_v = middle ** 2 - x
if eps_v < 0:
left = middle
middle = (left+right) / 2
eps_v = abs(eps_v)
elif eps_v > 0:
right = middle
middle = (left+right) / 2
else: return middle
return middle
print([math.sqrt(i) for i in range(0,9)])
print([sqrt(i) for i in range(0,9)])
结果
[0.0, 1.0, 1.4142135623730951, 1.7320508075688772, 2.0, 2.23606797749979, 2.449489742783178, 2.6457513110645907, 2.8284271247461903]
[0.0, 1.0, 1.4142135623729928, 1.7320508075689105, 2.0, 2.2360679774997294, 2.449489742783168, 2.6457513110642026, 2.8284271247461987]
开根号有个快速方法,还未看:https://blog.youkuaiyun.com/Skywalker1111/article/details/116295522
pi
https://www.zhihu.com/question/402311979
import math
pi = 1/(2*math.sqrt(2)/9801 * sum([math.factorial(4*i)*(26390*i+1103)/math.factorial(i)**4/396**(4*i) for i in range(5)]))
print(math.pi)
print(pi)
结果如下
3.141592653589793
3.141592653589793
常用泰勒级数展开式
https://zhuanlan.zhihu.com/p/38