什么是高斯算法?“數學王子”高斯小時候非常淘氣,一次數學課上,老師為了讓小朋友們安靜下來,在黑板上列了一道很難的算式,讓大家在半小時內算出。1+2+3++99+100的得數,5分鐘不到高斯就舉起了小手,起初老師并不在意這一舉動,心想這個孩子又在搗亂了,但當他發現全班唯一正確的答案屬于高斯且計算方法是(1+100)+(2+99)+(3+98)…+(50+51)=101×50=5050時,才大吃一驚!因為這種簡便算法是老師從未教過的“等差數列求和”方法,后來人們把這種簡便算法稱作高斯算法。
那么我們用Scratcha編程的方法來設計一個“從1累加到100求和”的高斯算法程序腳本。
01
編程思路
算法是指用系統的方法描述解決問題的策略機制。涉及到數學問題時用到數學相關的算法。對于這個問題,如果你能像小高斯那樣發現其中的規律,那么就可以使用“50×101=5050”這種簡便算法快速報出答案了。不過,很多小朋友采用的計算方法很可能是從1累加到100,從而得到結果,這種硬算的方法對人來說比較復雜但卻是計算機所擅長的,具體計算過程如下:
第1步:0+1=1;
第2步:1+2=3;
第3步:3+3=6等到第100步:4950+100=5050。
從上述計算過程可以看到,雖然每一步計算的數字都在變化,但它的計算方式卻是有規律的,這就很適合使用循環結構來描述。如果用Sn表示從1累加到100的自然數的和,用i表示1到100變化的加數,那么上述計算過程的規律就是:每一步都是用上一步累加的和S加上每一步變化的加數i。這個計算規律可用公式:Sn=Sn+i來表示,注意這里的“=”是賦值的意思。
02
編程過程
1.建立循環變量i和求和變量Sn分別表示從1到100變化的加數與從1累加到100的自然數的和。
2.將變量i和求和變量Sn的初始值分別設為1和0.
3.將求和變量Sn設定為上一次累加的和Sn+本次變化的加數i,每重復執行一次,就將循環變量i增加1,共重復執行100次。
4.添加“說和停止這個腳本”指令積木,并把以上各段腳本按順序拼接起來,得到“1到100累加求和”程序的完整腳本。
編程思路1參考代碼如圖1:
03
編程思路
厲害的同學們或許已經發現了小高斯無意中使用了的等差數列求和公式:sn=(a1,+an)n/2,所以他很快求出了問題的答案。
1.建立首項變量;末項變量;項數變量分別賦值為對應的回答。
2.將求和設為首項加末項的和乘以項數的積除以2,得到1累加到100的求和過程。
3.停止這個腳本
編程思路2參考代碼如圖2:
通過上面的編程內容得知“1+2+3+…+100”。這個程序有兩種設計方法:一種是通過循環,讓計算機先計算1+2,然后計算+3,接著+4、+5 … 就這樣一直到 +100,這樣做99次加法就能得到結果了,這是一種思路。
但是還有另外一種思路,這是利用高斯算法,因為1+100 = 2+99 = 3+98,這些結果都等于101,總共有50對101,那么計算機只需要計算50x101就能得到最后的結果(圖3)。
04
小節
我們比較一下兩者的過程,第一種方法要計算99次,而第二種方法只需要計算1次,你覺得哪個方法更快更好呢?
顯然,正常人都選擇后者。因此,文章的目的,不是讓你計算出結果,而是要你用最優的方法得到結果,這才是編程的精髓。所以說,學編程的核心是算法,是同學們的編程思維。數學是一門重思考與理解、重嚴格的訓練、充滿創造性的科學,只有掌握了數學的思想方法和精神實質,才能由不多的幾個公式演繹出千變萬化的生動結論,顯示出無窮無盡的威力。”編程也是一樣要用到各種各樣的數學知識,在這個過程中,同學們也能接受到很多超前的數學知識,從而慢慢形成一個同齡人不具備的高維解題視角,對數學概念的理解也更加深刻。
編程是編程,數學是數學,二者即相互獨立,又有密切相關。二者都需要有一定的邏輯能力,也都能培養邏輯思維能力。學習編程,能夠很好地提升邏輯思維能力,也就可以在一定程度上反哺數學的學習;數學好那么在邏輯思維能力比較強,也容易理解編程。
通過上面的編程內容加速同學們了解決數學問題;數學的邏輯思維可以幫助更好地學習和理解編程。