少兒編程:編程思維與數學思維的激烈碰撞

2020-08-28 高考數學滿分的數學經

青少年編程如火如荼,有人說數學好編程就好,也有人說編程好數學也差不了。沒錯,兩者有緊密關聯,相輔相成,但也有一定的區別。下面是我和昍一起討論過的編程書上的幾個例子,都是從數學和編程兩個角度來思考,也算是一種別樣的嘗試。從中,可以瞥見編程思維和數學思維的差別。

例1:求1+2+3+4+…+100的和。

數學做法:基本就是等差數列求和,所以是(1+100)×100/2=5050,如果像高斯小時候的同班同學那樣死算,勢必會被當成傻瓜。

編程做法:我相信包括絕大多數計算機博士在內的都會用下面的程序

int sum = 0;

for(int i=1; i<=100; i++)

sum += i;

這無疑就是高斯同班同學的做法,但為什麼我們不嘲笑這個程序?因為我們通常認為計算機算的非常快,我們需要做的就是告訴它一個明確的計算規則就可以了。

例2:請給出斐波那契數列1,1,2,3,…的第100項。

編程做法:循環+迭代

int a = 1, b = 1, c;

int i = 3;

while(i<=100){

c=a+b;

a = b;

b = c;

}

孩子需要花一點時間理解迭代的做法。實際上,和之前的求和類似,這也是一種窮舉和遞推的做法。我們知道計算的遞推規則an+2=an+1+an, 為了計算第100項,我們得把前面的每一項都計算出來。

數學做法:數學家則遠遠不滿足對這個計算規則的確定,還希望有一個通用的公式能夠直接求出任何指定的一項,因此才有了斐波那契數列的通項公式。也正因如此,我們看到了那個著名的黃金分割數。一個整數序列的通項公式,竟然和一個無理數聯繫起來了。

例3:寫出下面程序的輸出

int main() {

int i, j;

for(i=20, j=0; i<=50; i++, j=j+5)

if(i==j)count<<i<<endl;

return 0;

}

編程做法:看程序寫輸出一般都是人腦逐步模擬程序的執行,然後從有限步執行推導出程序的功能,寫出輸出。

這裡,i從20開始,j從0開始,i每次增加1, j每次增加5,當i和j相等時輸出i的值。因此,執行了5次循環判斷後,輸出i=25。

數學做法:如果我們把這個問題按數學的思維來解讀一下,j在起點,i在j前面20米,j開始追i,j每秒走5米,i每秒走1米,請問j追上i時離起點多遠?

這就成了一個簡單的追及問題,j花20÷(5-1)=5秒追上i,此時距離起點25米。

在這裡,大家可以看到,數學可以做轉化和建模,把一個問題轉化和建模為另一個熟知的問題。

例4: 在大學校園裡,由於校區很大,沒有自行車上課辦事會很不方便。但實際上,並非去辦任何事情都是騎車快,因為騎車總要找車、開鎖、停車、鎖車等,這要耽誤一些時間。假設找到自行車、開鎖並騎上自行車的時間為27秒,停車鎖車的時間為23秒,步行每秒行走1.2米,騎車每秒行走3.0米。輸入距離(單位:米),輸出是騎車快還是走路快。

編程做法:從編程的角度,任意輸入一個距離,那麼我們可以分別算出騎車的時間和步行的時間,然後比較一下就可以得出答案。程序基本如下:

int d;

cin>>d;

double twalk = 50+d/3.0;

double tride = d/1.2;

if(twalk<tride)

cout<< 「走路快」<<endl;

else if(twalk>tride)

cout<<」騎車快」<<endl;

else

cout<<」一樣快」<<endl;

編程思維就和我們大部分人考慮問題的方式差不多,直腸子,要什麼,就求什麼。當然,上面的程序之所以說是基本上是這樣,是因為還有點小問題。問題在於計算機本身的限制:受制於表示的位數限制,計算機不能精確地存儲一個高精度的小數,例如一個無限循環小數或無理數,那麼當兩個數非常接近時可能會出錯。

一個改進的做法是,儘量不做除法。我們可以把twalk和tride兩邊都乘以6,得到:

twalk6 = 300+2*d;

tride6 = d*5;

此時,再去比較twalk6和tride6會好的多。

數學做法:首先分析出一定存在一個臨界值x,當距離超過這個臨界值時騎車快,而小於這個臨界值時是走路快,如果恰好是這個臨界值x,那麼兩者所花時間相等。

可以這麼來解讀這個題:走路速度每秒1.2米,先走了50秒,然後騎車人開始追走路的人,騎車速度每秒3米,那麼騎車人追上走路人時,騎了多少路?

解這個題,走路先走了60米,騎車人從開始到追上花了60÷(3-1.2)=100/3秒,總共騎了100/3×3=100米。也就是說距離是100米,那麼走路和跑步一樣快,超過100米,騎車快,少於100米則是步行快。

可以看到,這裡我們又一次把它建模成了一個追及問題。

例5:為了學生的衛生安全,學校給每個住宿生配一個水杯,每隻水杯3元,大洋商城打八八折,百匯商廈「買八送一「。輸入學校想買水杯的數量,請你當」參謀「,算一算:到哪家購買較合算?輸出商家名稱。

編程方法:還是直腸子,任意輸入水杯的數量,我們可以先計算出到每個商家購買的總費用,然後比較輸出:

int cups;

double total;

cin>>cups;

a = cups*3*0.88;

b = (cups – cups/9)*3;

if(a<b)

cout<<」大洋商城」<<endl;

else

cout<<」百匯商廈」<<endl;

數學做法:簡單分析一下,買八送一最划算的就是買9的倍數的杯子數,此時能達到最優的折扣,是88.9%。這個最優折扣都比大洋商城來得高,因此不用算,無論買多少個杯子,都是大洋商城划算。

這個小例子體現了數學和工程技術思維的差別。我們投稿一些計算機會議或期刊,即便做了理論分析與論證,有些審稿人也要求做實驗驗證。隔壁辦公室是個做密碼學的老師,他們的論文就完全不同,都是證明完了直接結束。實際上確實,數學證明是最嚴謹的,實驗驗證還受很多環境的影響,可信度才要打問號。

例6:雞兔同籠,共有頭35個,腿90條,問雞兔各有幾隻?

數學解法:五花八門的解法很多,如抬腿法,假設法,方程法等等。

比如假設法,可以假設全是雞,那麼一共有70條腿,比實際少了20條腿,為什麼?(能夠反問自己為什麼是我認為最重要的一種素質)。因為把兔子看成是雞了。一隻兔子假設成一隻雞少2條腿,所以兔子是(90-70)÷2=10隻,雞是25隻。

也可以用方程,假設有x只雞,那麼兔子有35-x只,所以得到方程2×x+4×(35-x)=90,解得x=25。

編程做法:編程可以很暴力。既然共有35個頭,那麼雞最少0隻,最多35隻,枚舉一遍逐個驗算即可。

for(int i=0;i<=35;i++)

if(i*2+(35-i)*4==90)

cout << 「雞=」<<i<<「,兔子=」<<35-i<<endl;

可以看到,編程做法更類似於我們數學中的驗算。本質上是用方程建模,用枚舉求解。

例7:求1+(1+2)+(1+2+3)+…+(1+2+3+…+10)的值

編程做法:我的第一個想法是用個雙重循環,沒想到昍第一個想法居然是用下面的一重循環。很明顯,這比雙重循環更簡練。這實際上讓計算機少幹了不少活,用計算機的術語說,就是計算複雜度(另一個是要考慮的是空間複雜度)降低了。

int i, a=0, s=0;

for(i=1;i<=10;i++)

{

a=a+i;

s=s+a;

}

cout<<s;

數學做法:按數學思維,一開始就要把這個問題抽象化為1+(1+2)+(1+2+3)+…+(1+2+3+…+n)。一種做法是變成1×n+2×(n-1)+3×(n-2)+…+n(n-(n-1))=1×n+2×n+…+n×n-(1×2+2×3+…+(n-1)×n),後面就不介紹,學過等差和列項應該有所了解。

昍爸:曾獲初中和高中全國數學聯賽一等獎,江蘇賽區第一名,高考數學滿分,現為大學計算機專業教授,

公眾號:xuanbamath

相關焦點

  • 少兒培訓市場風口:從少兒英語切換到少兒數學思維、少兒編程
    為什麼少兒數理思維和少兒編程會迅速崛起,從「小眾」進步為「大眾需求」?1、數學思維是理工科基礎,即使是學文科、數學好,升學考試分數優勢更明顯,很多家長上學時吃了數學不好的虧,給孩子補習數學意願更加強烈,再加上理科生就業選擇空間比文科生更大,無論是數學啟蒙興趣和悟性培養還是現實考量都使得數學思維少兒培訓有著極為廣闊的市場,這使得「少兒數學」以及數學思維的品牌僅次於英語火爆程度。
  • 少兒編程學霸孩子必備的三種思維,編程思維的速成方法
    編程思維是孩子最需要的,是認知新事物的能力。而讓大腦接受一個新的東西,需要的有這麼幾種思維:分解思維、框架思維、抽象思維。簡單來說,當一個有關新事物的信息傳到大腦。隨著時代的發展,人工智慧已經慢慢融入到我們的生活,一些可以全方位地開發孩子大腦,又引領孩子走在時代前沿的學科,正在被一點點的簡化,並融入到少兒教育中。
  • 核桃編程小創客對話北大圖靈班學霸:少兒編程增強數學思維
    勢不可擋的人工智慧洪流正在湧入生活的方方面面,而編程作為人與人工智慧對話的重要語言,從小學習編程將為孩子的學習成長提供助力。徐揚教授指出,少兒編程可以培養孩子做事的章法,激發孩子隱性知識的顯性化,以及鍛鍊孩子的耐心。
  • 編程思維才是學習少兒編程培訓的關鍵
    「孩子需要學編程嗎?」「需要,因為有必要培養孩子的編程思維,領會這種新的思維對孩子在成長過程中遇到問題時能夠提供新思路,對於解決問題會有啟發性的意義。邏輯思維培養可以引導孩子發現問題、解決問題,以後不能保證每個人都會編程,但每個人都或多或少了解編程。所以當孩子獲取的知識多的時候就會有不一樣的廣闊天地。」
  • 解析計算思維與少兒編程的關係
    少兒編程風頭正勁,有傳言編程將取代英語,成為下一個進入高考的科目。那麼,被機構熱炒的「全世界多個國家都在全民推廣的少兒編程」,真相究竟如何呢?其實,少兒編程在上個世紀60年代就已經出現並得到推廣(《》),而且目前國際上公認的少兒階段培養目標並不是學習編程,而是利用編程促進計算思維的培養。學習少兒編程是不是就等於培養計算思維呢?二者之間是什麼樣的內在聯繫呢?
  • 編程貓孫悅:少兒編程絕不是教孩子編程技能,而是培養編程思維|WISE...
    比如數學、語文、外語都已經在這個行業存在多年了,都在探討有什麼樣的模式更好,但編程這個學科在5年前甚至都是不存在的。所以在這樣一個全新的領域,我們會得到很多反饋,甚至經常會看到少兒編程上熱搜,前幾天還討論少兒編程到底是不是智商稅的問題。所以我今天非常高興借這個機會跟大家追溯一下少兒編程是什麼。首先少兒編程不是為了教孩子編程技能,而是為了教孩子編程思維。
  • HelloCode:到底什麼是「少兒編程思維」
    「少兒編程熱」讓很多家長開始了解少兒編程,家長們出於各種各樣的理由,為了讓孩子能夠有一個好的未來;而有一些家長是為了孩子的升學考試;但還有很多的是希望自己的孩子能夠有更強大的邏輯能力。這也就是少兒編程的核心——編程思維,這個詞語是非常複雜的,很多家長都不了解這到底是什麼,僅僅把它簡單地歸化為思考的能力。
  • 少兒編程與成人編程的區別
    ​對於少兒編程,很多家長都會有同樣的一個疑問,我家孩子長大又不一定當程式設計師,為什麼要從小學習編程呢?​二、學習的內容不同少兒編程是把計算機編程融合孩子興趣的同時加強孩子思維能力的鍛鍊,還能更多的促進數學、英語、物理等學科相關聯的內容。
  • 少兒編程與少兒編程教育
    ​1.什麼是少兒編程?編程簡單來說就是依靠編寫程序來告訴計算機要做什麼。少兒編程往往會把大家帶入一個誤區,即少兒編程就是讓孩子寫代碼!,培養孩子的編程思維,讓孩子了解編程原理,學習怎麼完成一個整體的每個部分,通過每一步的分解學習再把每一部分合併組合,最終完成一個項目。
  • 學霸孩子必備的三種思維,編程思維的速成方法
    編程思維是孩子最需要的,是認知新事物的能力。而讓大腦接受一個新的東西,需要的有這麼幾種思維:分解思維、框架思維、抽象思維。簡單來說,當一個有關新事物的信息傳到大腦。大腦首先會對該信息進行拆解,接著將拆解出來的模塊組合形成一個框架,最後抽象出一個能被理解的新概念。大腦這麼一番活動過後,人才能對新事物有一個大體的理解。
  • 章魚超人解構什麼是編程思維
    隨著一系列政策的出臺,表明編程教育逐漸從「非剛需」轉變成「剛需」,這是教育領域不可逆轉的時代趨勢和世界潮流,懂得少兒編程的孩子:將成為這個世界的主動創造者。那麼章魚超人推崇的編程思維是什麼呢?其實,編程思維是孩子在學習少兒編程時具備的一種思維方式,未來是人工智慧時代,少兒編程培養孩子編程邏輯思維,學過編程的孩子思維更靈活,未來可以更加從容地應對變化。
  • 編程太「深奧」?一文讀懂大家常說的「編程思維」
    隨著時代的發展,人工智慧已經慢慢融入到我們的生活,一些可以全方位地開發孩子大腦,又引領孩子走在時代前沿的學科,正在被一點點的簡化,並融入到少兒教育中。這其中最具代表性地,要數少兒編程了。一個有分解思維的孩子接受到一個任務後,他會懂得把任務分解成一個個的步驟,就像解答數學幾何題目一樣,通過一步步地求證,得出最終的結論。這種分解思維,就是孩子大腦中的「解碼器」,當孩子遇到無法理解的知識,這個「解碼器」會把生澀的語言解碼,讓孩子更容易去理解去學習。而孩子學習編程,正是為了獲得一種極度類似於分解思維的計算機「解碼器」。
  • 西瓜創客培養超百萬孩子編程思維,少兒編程納入中小學課程
    從而幫助學生掌握信息技術基礎知識與技能、增強信息意識、發展計算思維、提高數位化學習與創新能力、樹立正確的信息社會價值觀和責任感。「從娃娃抓起」已經成為許多國家的共識,英國在2014年成為世界上第一個強制5-12歲兒童接受編程教育的國家,並把編程列入了每所學校的必修課程;美國是當前少兒編程教育滲透率最高的國家,高大44.8%;芬蘭作為世界公認的最優質的教育之一,2016年就開始全國實施新的《國家核心課程大綱》中,首次將編程納入小學教學大綱,從小學一年級開始教授編程。
  • 小碼王少兒編程口碑怎麼樣,學編程思維對孩子學習提升有幫助嗎
    在孩子學習的過程中,小碼王少兒編程口碑怎麼樣,學編程思維對孩子學習提升有幫助嗎?下面我們一起來了解一下吧。小碼王少兒編程口碑怎麼樣幫助孩子提升智力能力專業的兒童思維訓練可以激發孩子的體力,提高孩子的大腦運動和反應能力,讓孩子根據遊戲規則調整時間,
  • 極客晨星:少兒編程的核心不是學會一堆知識,而是學會一種思維
    極客晨星作為少兒編程專業培訓機構認為,編程的核心不是學會一堆知識,而是學會一種思維。少兒編程培養的是孩子的編程思維,未來,少兒編程也將成為舉足輕重計算機語言,更是未來人工智慧時代的「溝通」語言。讓孩子學編程,不是為了培養未來的程式設計師,而是希望通過這種學習訓練,掌握人工時代最重要的一種必備技能——編程思維。擁有了編程思維,孩子可以更好地理解人工智慧時代的運轉規則,更從容地應對未來的訊息萬變。
  • 小創客編程營《Python數學思維趣味編程(1)》
    編程知識已應用到我們的日常生活中,如小遊戲、機器人、無人超市等。學習編程,可以提高解決思考和邏輯問題的能力,特別是鍛鍊大腦開發和思維能力,讓孩子「像科學家一樣思考,像工程師一樣解決問題」。「小創客編程營」邀請編程專家,每月選取一個主題與數學、語文、英語、藝術、科學等多個學科結合為小讀者帶來一系列課程帶領大家一起體驗編程的無窮魅力本期編程課主題為《Python數學思維趣味編程(1)》對編程感興趣的小讀者們千萬別錯過這次機會趕快訂票參與吧
  • 學習樂高、機器人編程、少兒編程的區別是什麼?
    機器人編程?還是少兒編程課程,畢竟這一堆名詞過來,也確實能搞暈一群人。STEAM教育就是集科學,技術,工程,藝術,數學多領域融合的綜合教育;STEAM教育理念最早是美國政府提出的教育倡議,為加強美國K12關於科學、技術、工程、藝術以及數學的教育。STEAM的原身是STEM理念,即科學(Science)、技術(Technology)、工程(Engineering)、數學(Mathematics)的首字母。
  • iCoding愛編程培養孩子五大思維能力
    那麼,該如何培養孩子的思維能力,讓孩子真正受益一生呢?蘋果公司創始人賈伯斯早已對這個問題給出答案:「學編程最大的好處其實是可以對人的思維方式進行訓練。它是一個對思維完整性和邏輯性進行訓練的過程。」iCoding愛編程抓住孩子邏輯思維訓練黃金期,基於青少兒認知規律,針對不同年齡段孩子定製研發出專業課程體系,涵蓋智能積木編程、樂高機器人編程、Scratch圖形編程、Python代碼編程、NOI信息學奧賽等,幫助孩子鍛鍊邏輯思維、抽象思維、系統思維,提升解決問題和創新創造能力,培養嚴謹習慣,全方位提升綜合素養,助力提高學科成績。一是培養孩子邏輯思維。
  • 學的不是寫代碼,學的是編程思維
    >進入基礎學科,意在通過培養孩子的計算機思維和編程思維,幫助他們更好地理解未來世界的事物,在其他領域得到應用價值。編程教育≠學寫代碼由於競爭激烈及教育體制等原因,中國家長在考慮讓孩子學什麼的時候,常常以 「是否對孩子升學有幫助」 為衡量標準,這讓中國家長一直背負著 「功利」 的壞名聲,也讓孩子們的成長有點 「拔苗助長」 的意味。
  • 杭州少兒編程培訓去哪家好?編程助力孩子升學
    學少兒編程對孩子的升學究竟幫助?相信這幾乎是所有家長們所關心的! 杭州少兒編程培訓去哪家好?小碼王兒童編程怎麼樣? 在學習編程求解的過程中,孩子們會學到很多在學校沒有學過的數學知識,慢慢形成一個同齡人不具備的高維解題視角能力,對數學概念的理解也更加深刻。 編程中涉及的邏輯、組織和分析數據,以及將問題分解為更小部分,再逐個解決的拆解思維,在解決很多數學問題時一樣可以用到。