【问题标题】:How to write a Python program to determine which of these two quantities is bigger? [closed]如何编写 Python 程序来确定这两个量中哪个更大? [关闭]
【发布时间】:2016-01-29 15:09:12
【问题描述】:

我想确定 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函数里面还是外面有什么区别?

【问题讨论】:

  • 我想知道是什么导致我的问题被否决?
  • 没有花时间找出如何在问题中格式化代码,没有发布任何尝试,没有解释他卡在哪里,添加了与问题完全无关的语句,没有花时间谷歌基本的内置函数,如max。需要更多?
  • 一个程序来确定 2 个数量中哪个更大?你的意思是 max() 函数?还是您的意思是您想知道随着 n 趋于某个值,哪一个增长得更快?
  • 是的,您也可以将参数传递给 Python 函数。如果您必须对每个值进行硬编码,那么它作为一种编程语言实际上是完全没用的。
  • @Juhana 现在请看看我的问题。我已经对其进行了编辑以使其更容易接受。

标签: python python-2.7


【解决方案1】:

您可能会想看看数学上的东西会像那样爆炸。天真地这样做将意味着您的代码将需要很长时间才能执行,并且如果 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

【讨论】:

  • 首先你谈论性能,然后你递归地写阶乘...... :)
  • 是的...Python 在递归方面也特别糟糕,不是吗?
  • 有点。我建议只计算一次所有阶乘并将结果存储在字典中。但作为一个让 OP 开始的幼稚解决方案,你的答案很好。
  • @user3088440 谢谢。但是您的代码仅比较这两个数量的 n 从 1 到 4。对吗?我要询问的是是否可以编写代码将这两个量与一般 n 进行比较,就像我们在数学中所做的那样(尽管使用不同的方法)。例如,我们是否可以编写代码告诉我们,当 n 是任何大于 0 的整数时,2n 总是大于 n,而不给 n 分配任何值?
  • 我想编写一个通用代数求解器将是一项非常艰巨的任务。如果你想自己写,你可能需要做一些研究。如果你想要它的实用性,Wolfram Alpha 几乎可以解决任何问题wolframalpha.com
【解决方案2】:
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 - as 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!。)

【讨论】:

  • 是的,你是对的。但是,例如,我可以编写一个 Python 代码来告诉我对于所有正整数 n > 3,n^2 小于 n 阶乘吗?在数学上,我们可以证明这个特定的事实(例如使用归纳法)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-31
  • 1970-01-01
  • 1970-01-01
  • 2022-10-24
  • 2016-08-12
  • 2021-11-28
相关资源
最近更新 更多