如果 高斯 小時候學過python,會怎麼用程式計算 1+2+3+...+100?

閱讀時間約 5 分鐘

前言

相傳有一個故事,
數學家高斯的小學數學老師出了一道從1+2+3+...+100的習題,
想讓活潑好動的小學生們算一整節課,消耗一下多餘的體力,
結果老師剛說完題目沒過多久,小高斯就算出了答案。

原來,他發現數列兩端可以兩兩配對:1+100,2+99……每一對的和都是101,共有50對,所以總和是5050。讓老師讚嘆不已,也讓老師對這個與眾不同的小高斯刮目相看。


如果 高斯 小時候學過python,會怎麼用python程式來計算 1+2+3+...+100?


先回到故事的起點,小高斯可能會這樣寫:


根據1+2+3+...+100的對稱性,小高斯推導出

數列和 = (首項 + 末項) * 項數 / 2

def range_sum(start, end):

n = end - start + 1
summation = (start + end) * n // 2

return summation

print( range_sum(start=1, end=100) )

輸出結果

5050

但是小高斯求知若渴,不滿足於此,他想試試看Python可以有多少種不同的實作方式,來算出1+2+3+...+100的和。


根據小高斯學過C/C++的經驗,很快想出python對應的

for loop based 迭代寫法

def range_sum(start, end):

summation = 0
for i in range(start, end+1):
summation += i

return summation

print( range_sum(1, 100) )

輸出結果

5050


然後,思索片刻,小高斯又想到數學老師說,
迭代和遞迴往往彼此擁有等價互通的寫法。又寫出了對應的

遞迴形式解

def range_sum(start, end):

if start == end:
return start
else:
return range_sum(start, end-1) + end

print( range_sum(1, 100) )

輸出結果

5050


這時候,他又想起電腦老師教過python特有的list comprehension列表生程式,
寫起來乾淨又清爽。

list comprehension列表生程式

def range_sum(start, end):

numbers = [ i for i in range(start, end+1) ]
return sum( numbers )

print( range_sum(1, 100) )


小高斯發現,其實list comprehension 就已經生成實體的list了,不用額外建立變數,可以直接放在sum裡面做加總計算。

def range_sum(start, end):

return sum( [ i for i in range(start, end+1) ] )

print( range_sum(1, 100) )

輸出結果

5050


小高斯中途休息喝水時,又瞥見桌上的PEP 289的標題就是Generator expressions,還可以使用生成器的方式來動態生成元素,更節省記憶體。

Generator expression

def range_sum(start, end):

return sum( ( i for i in range(start, end+1) ) )

print( range_sum(1, 100) )

輸出結果

5050


小高斯看著輸出畫面,又想到range本身就是一個帶有定義的序列,可以直接放在sum()作加總。

Sum() with range

def range_sum(start, end):

return sum( range(start, end+1) )

print( range_sum(1, 100) )


接著,他又想起好像在書上看過,python支持functional programming,函數式計算,一個function的輸出可以傳給另一個function當作輸入。

相當於用add當作運算子,對1,2,3,...,100 做 map reduce,就可以得到1+2+3+...+100。

Map Reduce

from functools import reduce
from operator import add

def range_sum(start, end):

return reduce(add, (i for i in range(start, end+1) ) )

print( range_sum(1, 100) )

輸出結果

5050


其中,add也可以不要import,用lambda expression 代替

from functools import reduce

def range_sum(start, end):

return reduce(lambda x,y: x+y, (i for i in range(start, end+1) ) )

print( range_sum(1, 100) )

輸出結果

5050

這時候,小高斯還專注在思考的過程中,
忽然聽見熟悉的下課鐘聲聲響起,噹~噹~噹~噹~噹~噹~噹~噹~

小高斯這才心滿意足地將程式碼存檔,關上電腦,收好課本。

準備到體育館去和同學一起參加下一節的體育課。

82會員
417Content count
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
發表第一個留言支持創作者!
在程式語言裡,對應到多重選擇路徑判斷的語法, 最通俗也最常見的就是if ... else ... 語法。 今天,我們將從最基本的 若A條件成立 則...否則 ... 的 if ... else ...開始講起, 搭配幾個範例做說明,最後以一個經典的閏年判定最為結尾的Demo
河內塔的遊戲描述 有三個柱子A柱,B柱,C柱。 A柱上有 N 個 (N>1) 穿孔圓盤,盤的尺寸由下到上依次變小。 要求按下列規則透過合法移動,將所有圓盤移至 C 柱: 1. 每次只能移動頂端的一個圓盤; 2. 大圓盤不能疊在小圓盤上面。
今天要實作和體驗的是拼單字的小遊戲,類似小時候在報紙、英文童書、或著電子辭典的小遊戲,一開始都是空白,隨著使用者拼對而逐漸顯示原本的單字樣貌,直到整個單字拼出來為止。 場景: 電腦隨機從單字庫裡面撈一個單字出來。 讓使用者扮演玩家去玩拼單字的遊戲。
相信大家小時候都有和朋友或玩伴玩過一個猜數字的小遊戲,一個人先在1~100裡面設定一個隱藏數字,其他的人去猜,看誰是最後一個猜中的就算輸,或者看誰最快猜中就算贏。 今天要示範如何用Python寫一個猜數字遊戲, 並且會從上層的思考邏輯開始,一步步構建出這個猜數字的小遊戲。
在流程控制中,最常用的就是for loop 或是 while loop 語法了。 最常見的場景就是根據條件判斷式,重複執行特定的指令。 如果要在python寫出類似C/C++ for loop,可以怎麼寫呢? 透過索引去進行迭代 for var in range( start=0, sto
Array可以說是各種語言除了基本型別之外,最常用的資料型別與容器之一了。 Array 這種連續格子狀的資料結構,在Python要怎麼表達呢? 建立一個空的陣列 最簡單也最直接的寫法就是 array = [] # Python list [] 就對應到大家熟知的array 陣列型態的資料結
在程式語言裡,對應到多重選擇路徑判斷的語法, 最通俗也最常見的就是if ... else ... 語法。 今天,我們將從最基本的 若A條件成立 則...否則 ... 的 if ... else ...開始講起, 搭配幾個範例做說明,最後以一個經典的閏年判定最為結尾的Demo
河內塔的遊戲描述 有三個柱子A柱,B柱,C柱。 A柱上有 N 個 (N>1) 穿孔圓盤,盤的尺寸由下到上依次變小。 要求按下列規則透過合法移動,將所有圓盤移至 C 柱: 1. 每次只能移動頂端的一個圓盤; 2. 大圓盤不能疊在小圓盤上面。
今天要實作和體驗的是拼單字的小遊戲,類似小時候在報紙、英文童書、或著電子辭典的小遊戲,一開始都是空白,隨著使用者拼對而逐漸顯示原本的單字樣貌,直到整個單字拼出來為止。 場景: 電腦隨機從單字庫裡面撈一個單字出來。 讓使用者扮演玩家去玩拼單字的遊戲。
相信大家小時候都有和朋友或玩伴玩過一個猜數字的小遊戲,一個人先在1~100裡面設定一個隱藏數字,其他的人去猜,看誰是最後一個猜中的就算輸,或者看誰最快猜中就算贏。 今天要示範如何用Python寫一個猜數字遊戲, 並且會從上層的思考邏輯開始,一步步構建出這個猜數字的小遊戲。
在流程控制中,最常用的就是for loop 或是 while loop 語法了。 最常見的場景就是根據條件判斷式,重複執行特定的指令。 如果要在python寫出類似C/C++ for loop,可以怎麼寫呢? 透過索引去進行迭代 for var in range( start=0, sto
Array可以說是各種語言除了基本型別之外,最常用的資料型別與容器之一了。 Array 這種連續格子狀的資料結構,在Python要怎麼表達呢? 建立一個空的陣列 最簡單也最直接的寫法就是 array = [] # Python list [] 就對應到大家熟知的array 陣列型態的資料結
你可能也想看
Thumbnail
重點摘要: 1.9 月降息 2 碼、進一步暗示年內還有 50 bp 降息 2.SEP 上修失業率預期,但快速的降息速率將有助失業率觸頂 3.未來幾個月經濟數據將繼續轉弱,經濟復甦的時點或是 1Q25 季底附近
Thumbnail
近期的「貼文發佈流程 & 版型大更新」功能大家使用了嗎? 新版式整體視覺上「更加凸顯圖片」,為了搭配這次的更新,我們推出首次貼文策展 ❤️ 使用貼文功能並完成這次的指定任務,還有機會獲得富士即可拍,讓你的美好回憶都可以用即可拍珍藏!
Thumbnail
一、基本算術運算符號 加法:+ 減法:- 乘法:* 除法:/(返回浮點數) a = 1 b = 2 print( a + b ) # 加法 輸出:3 print( a - b ) # 減法 輸出:-1 print( a * b ) # 乘法 輸出:2 print( a / b ) #
Thumbnail
國中數學第三冊 第一單元 乘法公式與多項式 1-2 多項式與其加減 例題解說
小學一年級數學,通常是由數一數開始,也就是數數。 數數有很多種不同的方式,還未學習任何數數的小朋友,只會根據自已理解的方式來數數,因此一開始必須讓小朋友瞭解各種數數的方式。
Thumbnail
在Python中,數值運算非常直觀,你可以使用標準的數學運算符號進行基本的數值運算。以下是一些基本的數值運算: 進行計算時,按照「先乘除後加減」的規則,並優先計算小括號刮起來的運算式。 print('答案:' ,(1+1)*2) #​答案: 4 復合型態的運算子 指定運算子 = 若是結合算術
Thumbnail
重點摘要: 1.9 月降息 2 碼、進一步暗示年內還有 50 bp 降息 2.SEP 上修失業率預期,但快速的降息速率將有助失業率觸頂 3.未來幾個月經濟數據將繼續轉弱,經濟復甦的時點或是 1Q25 季底附近
Thumbnail
近期的「貼文發佈流程 & 版型大更新」功能大家使用了嗎? 新版式整體視覺上「更加凸顯圖片」,為了搭配這次的更新,我們推出首次貼文策展 ❤️ 使用貼文功能並完成這次的指定任務,還有機會獲得富士即可拍,讓你的美好回憶都可以用即可拍珍藏!
Thumbnail
一、基本算術運算符號 加法:+ 減法:- 乘法:* 除法:/(返回浮點數) a = 1 b = 2 print( a + b ) # 加法 輸出:3 print( a - b ) # 減法 輸出:-1 print( a * b ) # 乘法 輸出:2 print( a / b ) #
Thumbnail
國中數學第三冊 第一單元 乘法公式與多項式 1-2 多項式與其加減 例題解說
小學一年級數學,通常是由數一數開始,也就是數數。 數數有很多種不同的方式,還未學習任何數數的小朋友,只會根據自已理解的方式來數數,因此一開始必須讓小朋友瞭解各種數數的方式。
Thumbnail
在Python中,數值運算非常直觀,你可以使用標準的數學運算符號進行基本的數值運算。以下是一些基本的數值運算: 進行計算時,按照「先乘除後加減」的規則,並優先計算小括號刮起來的運算式。 print('答案:' ,(1+1)*2) #​答案: 4 復合型態的運算子 指定運算子 = 若是結合算術