如果 高斯 小時候學過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

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

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

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

留言
avatar-img
留言分享你的想法!
人家要看的是體育生☺️🤤
小松鼠-avatar-img
發文者
2024/08/12
林燃(創作小說家) 仙女姊姊,小松鼠感覺奧運的體操、游泳、網球項目會有不少巧克力腹肌磚😆
avatar-img
小松鼠的演算法樂園
95會員
427內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
2024/10/10
從Python 內建deque資料結構的角度切入, 同時了解deque 與 FIFO Queue相關的function用法。 collections.deque是一種兩端點皆可進出的雙端佇列 在兩端點高效地在O(1)常數時間內添加和刪除元素。 這使得deque非常適合實現FIFO Queue
Thumbnail
2024/10/10
從Python 內建deque資料結構的角度切入, 同時了解deque 與 FIFO Queue相關的function用法。 collections.deque是一種兩端點皆可進出的雙端佇列 在兩端點高效地在O(1)常數時間內添加和刪除元素。 這使得deque非常適合實現FIFO Queue
Thumbnail
2024/09/27
井字遊戲(OOXX)的遊戲描述 Tic Tac Toe(井字遊戲)是經典的雙人棋盤遊戲,在一個3x3的方格中進行。 每回合兩個玩家輪流選一個位置,先讓自己的符號(是 X 或 O)在 水平線、垂直線或對角線上連成一線的玩家宣告獲勝。
Thumbnail
2024/09/27
井字遊戲(OOXX)的遊戲描述 Tic Tac Toe(井字遊戲)是經典的雙人棋盤遊戲,在一個3x3的方格中進行。 每回合兩個玩家輪流選一個位置,先讓自己的符號(是 X 或 O)在 水平線、垂直線或對角線上連成一線的玩家宣告獲勝。
Thumbnail
2024/09/23
深入探討圖(Graph)的基本概念 及 最短路徑Shortest Path的尋找。 我們專注於廣度優先搜尋(BFS)演算法,以等權圖的最短路徑為例, 詳細說明如何利用BFS從起點擴散到終點,並且提供詳細的程式碼範例。 透過實作,讀者能夠更清楚理解圖論及BFS的應用,並體會水波紋擴散模型的重要性。
Thumbnail
2024/09/23
深入探討圖(Graph)的基本概念 及 最短路徑Shortest Path的尋找。 我們專注於廣度優先搜尋(BFS)演算法,以等權圖的最短路徑為例, 詳細說明如何利用BFS從起點擴散到終點,並且提供詳細的程式碼範例。 透過實作,讀者能夠更清楚理解圖論及BFS的應用,並體會水波紋擴散模型的重要性。
Thumbnail
看更多
你可能也想看
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
前言 相傳有一個故事, 數學家高斯的小學數學老師出了一道從1+2+3+...+100的習題, 想讓活潑好動的小學生們算一整節課,消耗一下多餘的體力, 結果老師剛說完題目沒過多久,小高斯就算出了答案。 原來,他發現數列兩端可以兩兩配對:1+100,2+99……每一對的和都是101,共有50對,所
Thumbnail
前言 相傳有一個故事, 數學家高斯的小學數學老師出了一道從1+2+3+...+100的習題, 想讓活潑好動的小學生們算一整節課,消耗一下多餘的體力, 結果老師剛說完題目沒過多久,小高斯就算出了答案。 原來,他發現數列兩端可以兩兩配對:1+100,2+99……每一對的和都是101,共有50對,所
Thumbnail
老是從頭重算可不是好法子,把加過的累積值存起來備用,這才符合 Prefix Sum 的精神!
Thumbnail
老是從頭重算可不是好法子,把加過的累積值存起來備用,這才符合 Prefix Sum 的精神!
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News