2010-05-18 53 views
5

好,所以我感覺有點愚蠢,因爲不知道這一點,但一個同事問,所以我在這裏問:我已經寫了一個python算法來解決他的問題。給定x> 0將所有數字從1添加到x。如何獲得Python算法的數學公式?

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

intsum(10) 
55 

第一,這是什麼類型的方程是這樣的,什麼是得到這個答案,因爲它顯然更容易使用其他一些方法正確的方法是什麼?

回答

15

這是遞歸,但由於某些原因,您將其標記爲因式分解。

在任何情況下,從1到n的總和,也不外乎:

n * (n + 1)/2

(你可以特殊情況下,它爲負值,如果你喜歡)

+0

謝謝,我只是用最接近的數學術語,我可以爲一個def名稱搶,改變它反映。算術序列就是這個名字。讚賞。 – Gabriel 2010-05-19 00:10:37

+3

高斯在9歲時如何發現這是我最喜歡的軼事之一:-) – 2010-05-19 00:11:45

+0

每一個J. Random Hacker的鏈鋸實現一個asciify或de-accenter將名字從Gauß改爲Gau :-( – 2010-05-19 00:35:19

1

考慮到N + 1 ,N-1 + 2,N-2 + 3等都加起來相同的數字,並且大約有N/2個這樣的實例(如果N是偶數,則恰好是N/2)。

+0

數學傷害了我的大腦,我不喜歡它 – 2010-05-19 00:06:54

1

你在那裏有什麼稱爲算術序列,並建議,你可以直接計算它,沒有可能由遞歸導致的開銷。

而且我會說這是一個家庭作業,儘管你說什麼。

+0

大聲笑,沒有我的妻子會笑在我現在如果她發現我不知道這個(我幫她用她的數學作業),這真的是我的同事,謝謝你的名字 – Gabriel 2010-05-19 00:12:18

+0

np,看起來太簡單了,但也發生在我身上: ) – 2010-05-19 00:13:38

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

拉里是非常正確的,他的公式,其計算所有整數之和高達n的最快方式。

但是爲了完整性,還有內置的Python函數,它們執行您已完成的工作,並在列表中使用任意元素。例如。

  • sum()

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

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

i有趣的是,這筆錢實際上給了我一個無效的結果。我試過你輸入的語法,然後去45,而不是55. – Gabriel 2010-05-19 02:49:41

+1

這是因爲範圍(10)是從0到9. – Dingle 2010-05-19 03:02:25

+0

@加布裏埃爾:Ups,我的壞。當然,它應該是'範圍(11)'...我寫這個時候已經太晚了...... – 2010-05-19 08:57:48

8

轉化整數的遞歸定義的序列導入那些能在封閉的形式表示爲離散數學引人入勝 - 我衷心推薦具體數學:計算機科學基礎,由羅納德格雷厄姆,唐納德克努斯和Oren Patashnik(見。例如關於它的wikipedia條目)。

然而,根據一則着名的軼事,你顯示的具體順序fac(x) = fac(x - 1) + x由Gauss在小學一年級時解決 - 老師給學生提供了從1到100的求和數字讓他們保持一段時間,但兩分鐘後,高斯的答案是5050年,並解釋說:「我注意到我可以總結第一個,第一個和最後一個100,這是101;第二個, 2,倒數第二,99,這又是101;顯然,重複50次,所以50次101,5050「。作爲證據並不嚴謹,但對於一個6歲的孩子來說是非常正確和恰當的;-)。

以同樣的方式(加上真正的初等代數),你可以看到一般情況是,正如很多人已經說過的那樣,(N * (N+1))/2(產品總是偶數,因爲其中一個數字必須是奇數和偶數;所以除以二將總是產生一個整數,根據需要,沒有餘數)。

+0

+1高斯軼事,讓我想起了我的父親:) – Agos 2010-05-19 00:12:59

+2

這是一個嚴格的證明,它只是沒有表演在我們通常與「嚴謹」相關聯的符號混亂中(這使得我的估計更好)。 – 2010-05-19 00:14:54

+0

@Stephen,由於「清晰」的揮手而不是嚴格的 - 它可以很容易做到(沒有符號,這會使它更長;-)。 – 2010-05-19 00:21:35

3

我不允許發表評論,所以我只是補充一點,你要小心使用range(),因爲它的基數爲0。您需要使用範圍(n + 1)來獲得所需的效果。

對不起,複製...

總和(範圍(10))!= 55

總和(範圍(11))== 55

+0

我注意到,當我在我的python上測試證明。 +1,希望你很快得到評論。 – Gabriel 2010-05-19 02:47:57

3

OP已經要求,在評論,作爲高斯作爲一名小學生的故事的鏈接。他可能想要退房this fascinating article by Brian Hayes。它不僅相當令人信服地表明高斯的故事可能是一種現代製造,而且還概述瞭如何看到將數字從1增加到100的模式相當困難。實際上,錯過這些模式的唯一方法是通過編寫程序來解決問題。

本文還討論了不同的方法來總結算術級數,這是OP問題的核心。還有一個無廣告版本here