如何编写Python程序来确定这两个数量中哪一个更大?

时间:2016-01-29 15:09:12

标签: python python-2.7

我想确定提升到相同功率的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函数内部或外部编写阶乘函数有什么区别?

2 个答案:

答案 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 -> +infn! -> (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!。)