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

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

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

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

86會員
425內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言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 陣列型態的資料結
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
Thumbnail
Faker昨天真的太扯了,中國主播王多多點評的話更是精妙,分享給各位 王多多的點評 「Faker是我們的處境,他是LPL永遠繞不開的一個人和話題,所以我們特別渴望在決賽跟他相遇,去直面我們的處境。 我們曾經稱他為最高的山,最長的河,以為山海就是盡頭,可是Faker用他28歲的年齡...
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
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
Thumbnail
Faker昨天真的太扯了,中國主播王多多點評的話更是精妙,分享給各位 王多多的點評 「Faker是我們的處境,他是LPL永遠繞不開的一個人和話題,所以我們特別渴望在決賽跟他相遇,去直面我們的處境。 我們曾經稱他為最高的山,最長的河,以為山海就是盡頭,可是Faker用他28歲的年齡...
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 復合型態的運算子 指定運算子 = 若是結合算術