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

2024-09-28 05:17:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我想确定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函数的内部或外部,有什么区别?你知道吗


Tags: or函数代码returnifdeftypeassert
2条回答
from math import factorial

def first_equation(n):
    nf = factorial(n)
    return nf ** nf

def second_equation(n):
    return factorial(n ** n)

但是你很快就会发现数字变得惊人的巨大,你花了很长时间等待,这并没有证明什么,因为你可能会得到一个不同的结果。你知道吗

相反,你需要象征性地接近它。我建议使用Stirling's approximation-as 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!无限大。)

你可能想看看数学,看看会爆炸成那样的东西。天真地做这件事意味着你的代码要花很长时间才能执行,如果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

相关问题 更多 >

    热门问题