程式演義第一四回 高斯課堂巴掌助興,阿蘭用心二解迴圈
第一四回 高斯課堂巴掌助興,阿蘭用心二解迴圈
上節宙斯為自己的決定高興之時,卻讓計劃的執行者傷透腦筋。傷腦筋的事在許多人的面前,卻是小菜一碟,對於某些搞數學的天才人物來說,正是這種原本的“體罰”,卻會帶來無盡的遐想。我們下面要說的故事和一位偉大的數學家相聯絡,他就是高斯。
圖2.14.1 高斯先生講述他的動手理論
2.14.1 P14高斯巴掌聲
高斯(Gauss)是德國數學家、天文學家和物理學家,被譽為歷史上偉大的數學家之一,和阿基米德、牛頓並列,同享盛名。高斯的成就遍及數學的各個領域,他十分注重數學的應用,並且在對天文學、大地測量學和磁學的研究中也偏重於用數學方法進行研究。
高斯1777年4月30日生於不倫瑞克的一個工匠家庭,1855年2月23日卒于格丁根。幼時家境貧困,但聰敏異常,受一貴族資助才進學校受教育。1795~1798年在格丁根大學學習,1798年轉入黑爾姆施泰特大學,第二年因證明代數基本定理獲博士學位。從1807年起擔任格丁根大學教授兼格丁根天文臺臺長直至逝世。
高斯十歲時,老師考了那道著名的“從一加到一百”,他也一下子樹立了在老師心中的地位。但頑皮是孩子們的天性,班上一幫頑皮的小夥計,老師一不在,大家就相互間玩起來了,玩得興起,大家相互間拍起了巴掌。等老師回來,還沒有停止,把老師氣火了,為了以示懲治,他給學生們出了一道題,誰做不出來,中午頭就不用回家吃飯了,題目如下:40個小同學,相聚在一堂,相互擊一掌,總計多少響?正沉浸在巴掌聲中的小朋友們一下子給難住了。小高斯動動腦,又第一個解了出來!我們的問題是:用電腦,我們如何求究竟多少響?而和上面問題對應的還有第二個問題:一班小同學,相聚在一常,相互擊一掌,總計780響,問多少小朋友,相聚在一堂?
2.14.2 高斯巴掌解析:
一問分析:
下面先看第一個問題,高斯課堂的巴掌聲,如何求出呢?我們不妨從1開始,列出一個表格:
人數 響數
1 0
2 1
3 1+2
4 1+2+3
…
40 1+2+3+…+39
這個規律是什麼呢?實質上和高斯求1-100的和差不多,是求1-39的和。這是一個非常規律化的問題,要不然高斯就求不出來了,用高斯求1-100的方法,值很簡單地就算出來了:(1+39)*39/2=780。用電腦如何求呢?
首先,我們需要重新發現一下上述規律。描述規律的過程中,最終要的是一種承接的關係,所以可以用多個變數,s1表示1個人的響聲,s2表示2個人的,…,s40則表示40人的響聲。最終的結構有了:
s1=0
s2=1
s3=s2+2
s4=s3+3
…
s40=s39+39
上面的程式碼中像隱藏了什麼東西,將下標去除後,會出現什麼結果。因為賦值語句具有的“形似神不似”特點,去掉下標後假設最終結果不會發生變化,那這個去除是很好的,是向正確的方向前進了一步。我們將數值代入演算一下,不難以現,其最終的結果是一樣的。
一個美妙的規律出現了:
s=0
s=1
s=s+2
s=s+3
…
s=s+39
細瞅一下,這個距離一個可用的美妙的迴圈還有差距,就在最後一點點上,最後是2,3,…,39,不能夠使它們表面上看上去一樣,如果能將這些東西做得相同,那就可以用迴圈了,所以還要變。又因為2,3,…,40的規律與計數器特點相吻合,所以,能不能將一個計數器
i=i+1
移入其中?二者的結合,就會出現我們想要的相似的形式。
1個人和2個人的情況可以先不管,從3個人有情況開始,這一個將計數器i=i+1融合其中,可以用三句來代表:
i=1
i=i+1
s=s+1
4個人的情況,有了前面的承接,只要兩句就可以了:
i=i+1
s=s+1
一直到40人的情況,都可以用上面的兩句來代表。
圖 三次變形
把前兩句移過來,上面的規律中,下面重複了37次,注意,i的初始值是1
i=i+1
s=s+1
圖迴圈
根據不同的語句特點,可以寫出與上面規律相同的程式來(如圖1示):
圖1
將第二句也加入規律中,但要保持變形等價,可以再加上一個值為0的s,即s=1變成s=s+1,因為語句右邊的s為0,所以兩句實現的實際作用相同。這一句可以放入後面的迴圈中,迴圈就是從1到39了(如圖2示):
圖2
原始碼也就有了:
s=0
for i=1 to 39
s=s+i
next i
print s
二問分析:
再看第二個問題:第二個問題和第一個問題不同,但其方法卻是一樣的,第一個是求1+2+…+39的和,而第二個是求1+2+…+?=780,求的就是這個最終的值,人數。
因為我們知曉規律是什麼,我們雖不能準確地判斷究竟是多少同學在班上,但範圍我們是能肯定的,因為高斯幫我們求過,1-100的和是5050,所以不是1人,也不是101人,但一定在1-101之間,下面,我們就選擇這個範圍,將符合條件的那個輸出出來,程式在上面程式的基礎上,在迴圈體內加上一個分支進行判斷,也就行了。
s = 0
For i = 1 To 100
s = s + i
If s = 780 Then
Print i + 1
End If
Next i
上面的程式有什麼缺點嗎,第二個示例的答案我們知曉,也應該是40人,所以會出現從41人到101人做的都是無用功,唯一的缺點是浪費挺大的。怎樣才能克服這種浪費呢?有沒有一種語句可以正好達到這個點,然後就停止工作呢?有!
我們可以先模仿規律,怎樣將規律模仿出來呢?自然我們可以從1個人的情況一直向下尋找,但向下找不能是無限制的,需要有一個截止的條件,這就是780響。所以它的處理過程也是個迴圈,迴圈執行多少次我們不知道,但只要數量滿足780響了,一切OK,我們就找到了那個和780響對應的數值了。
所以我們遇到一種和我們前面所用的完全不同的一種迴圈,迴圈的次數在程式設計時是不確定的。
圖3
程式碼如下:
s = 0
i = 0
While s < 780
s = s + i
i = i + 1
Wend
Print i ‘輸出
兩問對比:
兩種迴圈,都是為了方便我們解決問題的。關於迴圈,象我們從順序的狀態下向迴圈轉化時一樣,要注意其必需的三個條件:首先是,問題有超過三個以上的相似性,如果太少,迴圈的方便性就顯現不出來了。我們遇到的幾個問題,大都情況多於三個,本題中更是達到40個,這麼多的情況,自然首先想到要用迴圈。
其次是,迴圈的開始和結束要能夠控制,特別注意第二種情況,如果不能控制,將會出迴圈永遠執行的結果,造成的直接後果是當機!從這一點上說,兩種迴圈的形式是可以轉化的,如果把第一問轉成第二種迴圈形式,程式碼如下:
s = 0
i = 1
While i <= 39
s = s + i
i = i + 1
Wend
Print s
將兩段程式碼比較一下,上面的幾個特點會更明顯。
第三,是其傳達的“形似神不似”的效果,賦值語句的精彩正在此處,在潘多拉豆一節中我們有過介紹。正是賦值表面的相似,使得我們做迴圈時,更簡潔地找出那塊重複的東西,但它做實際工作卻一點都不含糊,還是那麼多!
2.14.3 阿蘭開講:
現實問題的分析過程,越分析到最後,可能越富有戲劇性,除了大問題是由小的基本問題組成的外,努力透過文字的描述去發現事物的真相,有時顯得尤其重要,怎麼辦呢?動手,寫下來,從最簡單的情況入手,畫出來,然後動腦找出其中蘊藏的東西。動手的時候記住目標,是外形的相似,所以要做出形如a=a+X類似的式子來,另外一個工具是記數器,通過記數器將外形不相似的部分,做成相似的東西。
迴圈是我們破解現實問題的在力工具。迴圈有三個特點:第一,超過三個以上的相似性,正因為相似,所以用一種對於人類來說簡潔的方法,將我們的簡單勞動解放出來;第二,迴圈次數是有限的,或者說應該努力分清其開始和結束的條件;第三,形似神不似的傳達者,賦值或賦值的形式!將些三特點把握了,迴圈的本質問題就搞清了。
此外,迴圈語句主要有兩大類:一種是迴圈次數確定,也就是中間的部分執行多少次,在程式設計的過程時我們就知曉了;另一種是迴圈次數不定的迴圈,或者也可以說迴圈多少次和我們的所求有直接的關係。只要針對實際問題應用好兩大類迴圈,再複雜的問題,就會迎刃而解了。
後面我們還將通過相應示例加以說明。欲知後事如何,且聽下節分解。
2.14.4 小測驗:過河
明明牽著一隻狗和兩隻小羊回家,路上遇到一條河,沒有橋,只有一個小船,並且船很小,他每次只能帶一隻狗或一隻小羊過河。你能幫他想想辦法,把狗和小羊都帶過河去,又不讓狗吃到小羊?
相關文章
- 程式演義第一二回 韋達破敵魔法助陣,解題阿蘭公式立功公式
- 《快學 Go 語言》第 3 課 —— 分支與迴圈Go
- 二叉樹先序迴圈,程式碼及詳解二叉樹
- C#程式設計基礎第七課:C#中的基本迴圈語句:while迴圈、do-while迴圈、for迴圈、foreach迴圈的使用C#程式設計While
- 【基礎題】【for迴圈】二重迴圈
- for迴圈、break和continue、二重迴圈
- 1252 不高興的津津 迴圈列舉
- 《C++程式與設計》(第 3 版)課堂作業 Work 12C++
- 第5周 5.2 迴圈結構
- Python入門第7課——tuple變數(只讀課堂)Python變數
- 11,javase程式碼實戰-迴圈控制——for迴圈實現九九乘法表(二)Java
- 程式訊號課堂筆記筆記
- Java課堂筆記(二):物件導向Java筆記物件
- 軟體需求分析 課堂測試二
- 事件迴圈詳解事件
- 解決迴圈引用
- 《程式設計珠璣》第二章-迴圈移位程式設計
- CodeMonkey少兒程式設計第6章 for迴圈程式設計
- JavaScript的map迴圈、forEach迴圈、filter迴圈、reduce迴圈、reduceRight迴圈JavaScriptFilter
- Vue.js第五課 迴圈語句Vue.js
- 青雲 QingCloud 實踐課堂(第 2 季深圳站)GCCloud
- Python入門第5課——字串變數初級(只讀課堂)Python字串變數
- 機器學習(課堂筆記)Day04:線性迴歸法機器學習筆記
- JS事件迴圈詳解JS事件
- 迴圈遍歷二叉樹二叉樹
- JavaScript(二):選擇、迴圈結構JavaScript
- C語言——迴圈結構(for迴圈,while迴圈,do-while迴圈)C語言While
- 視訊課程-迴圈中呼叫非同步方法非同步
- vue.js第四課 條件與迴圈Vue.js
- C#教程第四課:迴圈控制語句C#
- 無限for迴圈(死迴圈)
- 好程式設計師Python教程系列-第6講:迴圈結構程式設計師Python
- CodeMonkey少兒程式設計第3章 times迴圈程式設計
- 課堂練習
- 用WP_Query自定義WordPress主迴圈
- 第6章迭代迴圈與專案結束
- 第04天C語言(15):for迴圈-注意點C語言
- 為什麼每個人都該知道阿蘭·圖靈?圖靈