vocus logo

方格子 vocus

如果 高斯 小時候學過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
小松鼠的演算法樂園
99會員
428內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
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
債券投資,不只是高資產族群的遊戲 在傳統的投資觀念中,海外債券(Overseas Bonds)常被貼上「高資產族群專屬」的標籤。過去動輒 1 萬甚至 10 萬美元的最低申購門檻,讓許多想尋求穩定配息的小資族望而卻步。 然而,在股市波動劇烈的環境下,尋求穩定的美元現金流與被動收入成為許多投資人
Thumbnail
債券投資,不只是高資產族群的遊戲 在傳統的投資觀念中,海外債券(Overseas Bonds)常被貼上「高資產族群專屬」的標籤。過去動輒 1 萬甚至 10 萬美元的最低申購門檻,讓許多想尋求穩定配息的小資族望而卻步。 然而,在股市波動劇烈的環境下,尋求穩定的美元現金流與被動收入成為許多投資人
Thumbnail
透過川普的近期債券交易揭露,探討債券作為資產配置中「穩定磐石」的重要性。文章分析降息對債券的潛在影響,以及股神巴菲特的操作策略。並介紹玉山證券「小額債」平臺,如何讓小資族也能低門檻參與海外債券市場,實現「低門檻、低波動、固定收益」的務實投資方式。
Thumbnail
透過川普的近期債券交易揭露,探討債券作為資產配置中「穩定磐石」的重要性。文章分析降息對債券的潛在影響,以及股神巴菲特的操作策略。並介紹玉山證券「小額債」平臺,如何讓小資族也能低門檻參與海外債券市場,實現「低門檻、低波動、固定收益」的務實投資方式。
Thumbnail
解析「債券」如何成為資產配置中的穩定錨,提供低風險高回報的投資選項。 藉由玉山證券的低門檻債券服務,投資者可輕鬆入手,平衡風險並穩定財務。
Thumbnail
解析「債券」如何成為資產配置中的穩定錨,提供低風險高回報的投資選項。 藉由玉山證券的低門檻債券服務,投資者可輕鬆入手,平衡風險並穩定財務。
Thumbnail
相較於波動較大的股票,債券能提供固定現金流,而玉山證券推出的小額債,更以1000 美元的低門檻,讓學生與新手也能參與全球優質企業債投資。玉山E-Trader平台即時報價、條件式篩選與清楚的交易流程等特色,大幅降低投資難度,對於希望分散風險、建立穩定現金流的人來說,玉山小額債是一個值得嘗試的理財起點。
Thumbnail
相較於波動較大的股票,債券能提供固定現金流,而玉山證券推出的小額債,更以1000 美元的低門檻,讓學生與新手也能參與全球優質企業債投資。玉山E-Trader平台即時報價、條件式篩選與清楚的交易流程等特色,大幅降低投資難度,對於希望分散風險、建立穩定現金流的人來說,玉山小額債是一個值得嘗試的理財起點。
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