如何获得Python算法的数学方程?

时间:2010-05-18 23:58:07

标签: python algorithm math

好吧所以我因为不知道这个而感到有些愚蠢,但是同事问我这里问:我写了一个python算法来解决他的问题。给定x> 0将所有数字从1添加到x。

def intsum(x):
  if x > 0:
    return x + intsum(x - 1)
  else:
    return 0

intsum(10)
55

首先,这种类型的等式是什么,得到这个答案的正确方法是什么,因为使用其他方法显然更容易?

8 个答案:

答案 0 :(得分:15)

这是递归,但由于某种原因,你将它标记为像阶乘一样。

在任何情况下,从1到n的总和也很简单:

n * ( n + 1 ) / 2

(如果您愿意,可以使用负值的特殊情况。)

答案 1 :(得分:8)

将递归定义的整数序列转换为可以以封闭形式表达的整数序列是离散数学的一个迷人部分 - 我衷心推荐具体数学:计算机科学基础,作者:Ronald Graham,Donald Knuth和Oren Patashnik(参见例如关于它的wikipedia条目。)

然而,你所展示的特定序列,fac(x) = fac(x - 1) + x,根据一个着名的轶事,当他还是一年级的孩子时被高斯解决了 - 老师给了学生从1加起来的数字为了让他们在一段时间内保持畅快,但两分钟后,年轻的高斯得到答案,5050和解释:“我注意到我可以将第一个,第一个,最后一个,100个,即101个;和第二个,第二个,倒数第二个,99个,那也是101个;显然重复50次,所以,50次101,5050“。作为证据不严谨,但对于6岁的人来说非常正确和合适; - )。

以同样的方式(加上真正的初等代数)你可以看到,正如许多人已经说过的那样,(N * (N+1)) / 2(产品总是均匀的,因为其中一个数字必须是奇数而一个even;所以除以2将始终根据需要生成一个整数,没有余数。

答案 2 :(得分:4)

以下是如何证明arithmetic progression

的封闭表单
S  = 1 +   2   + ... + (n-1) + n
S  = n + (n-1) + ... +   2   + 1
2S = (n+1) + (n+1) + ... + (n+1) + (n+1)
     ^ you'll note that there are n terms there.
2S = n(n+1)
S = n(n+1)/2

答案 3 :(得分:3)

Larry对他的公式非常正确,并且是计算所有整数之和n的最快方法。

但是为了完整性,有一些内置的Python函数可以在带有任意元素的列表上执行你所做的工作。 E.g。

  • sum()

    >>> sum(range(11))
    55
    >>> sum([2,4,6])
    12
    
  • 或更一般,reduce()

    >>> import operator
    >>> reduce(operator.add, range(11))
    55
    

答案 4 :(得分:3)

我不允许发表评论,所以我只想补充一下,你要小心使用range(),因为它是0基础。您需要使用范围(n + 1)来获得所需的效果。

抱歉重复...

总和(范围(10))!= 55

总和(范围(11))== 55

答案 5 :(得分:3)

OP在评论中要求提供关于高斯作为小学生的故事的链接。

他可能想查看this fascinating article by Brian Hayes。它不仅令人信服地表明高斯的故事可能是一个现代的捏造,但概述了如何在不将数字从1到100的总和中看到相关的难度。事实上,错过这些模式的唯一方法就是通过编写程序来解决问题。

文章还讨论了算术进展的不同方法,这是OP问题的核心。还有一个无广告版本here

答案 6 :(得分:1)

考虑N + 1,N-1 + 2,N-2 + 3等等都加起来相同,并且大约有N / 2个实例(如果N是N,则为N / 2个)偶数)。

答案 7 :(得分:1)

你所拥有的是所谓的算术序列,如你所知,你可以直接计算它,而不会产生由递归引起的开销。

我会说这是一个功课,不管你说什么。