我想确定提升到相同功率的n的阶乘是否更大或者(n增加到幂n)的阶乘。
这是我的Python代码。
def whichIsLarger():
def fact(n):
assert type(n) == int
if n == 0 or n == 1:
return 1
else:
return n * fact(n-1)
print max( fact(n**n), fact(n)**fact(n) )
此代码是否正确执行(即没有任何语义错误)?
有没有办法在不为变量n?
指定任何特定值的情况下测试此代码我的意思是我希望Python为我做一般的(即数学或代数的osrt)比较,而不仅仅是通常的算术,例如,将值8分配给整数n会影响。
Python中是否有用于计算因子的内置函数?
如果我们在whichIsLarger函数内部或外部编写阶乘函数有什么区别?
答案 0 :(得分:2)
你可能想看看那些会像那样爆炸的数学。天真地做这将意味着你的代码需要很长时间才能执行,如果n开始变大,你将会重复很多东西。如果你能得到n-1和n之间的关系,你可能会发现你可以清除很多工作
尽管如此,这里有一些天真的代码可以帮助您入门,但如果可以,您可以尝试简化它
def factorial(n):
if n == 1:
return 1
return n *factorial(n-1)
def func1(n):
return factorial(n)**(factorial(n))
def func2(n):
return factorial(n**n)
for i in range(1, 5):
val1 = func1(i)
val2 = func2(i)
if val1 > val2:
print "func1 is larger: " + str(val1)
elif val2 > val1:
print "func2 is larger: " + str(val2)
else:
print "equal"
递归很糟糕,特别是在python上,请使用:
def factorial(n):
x = 1
for i in range(1,n+1):
x = x*i
return x
答案 1 :(得分:1)
from math import factorial
def first_equation(n):
nf = factorial(n)
return nf ** nf
def second_equation(n):
return factorial(n ** n)
但很快就会发现这些数字变得非常庞大,你花了很长时间等待,而且实际上并没有多大证据,因为可能会 大n
。
相反,你需要象征性地接近它。我建议使用Stirling's approximation - n -> +inf
,n! -> (n/e)**n * (2pi * n)**0.5
另一种方法是使用sympy
符号数学包:
import sympy as sp
# if you want LaTeX output, ie in iPython notebook
sp.init_printing(use_latex=True)
n = sp.symbols("n")
first_equation = sp.factorial(n) ** sp.factorial(n)
second_equation = sp.factorial(n ** n)
然后您可以直接使用方程式,例如
for n_val in range(7):
fen = first_equation .evalf(subs={"n":n_val})
sen = second_equation.evalf(subs={"n":n_val})
print(n_val, fen, sen)
产生
0 1.00000000000000 1.00000000000000
1 1.00000000000000 1.00000000000000
2 4.00000000000000 24.0000000000000
3 46656.0000000000 1.08888694504184e+28
4 1.33373577685028e+33 8.57817775342843e+506
5 3.17504237378034e+249 2.41317228491761e+9566
6 1.90281878633202e+2057 6.89642755739806e+197572
或象征性地,如
# find the limit as n -> +infinity
relation = first_equation / second_equation
limit = sp.limit(relation, n, sp.oo)
print("Limit of eq1/eq2 as n -> +inf is {}.".format(limit))
产生
Limit of eq1/eq2 as n -> +inf is 0.
(即(n**n)!
将无限大于n! ** n!
。)