程式演義第一三回 宙斯有意千天撒豆,潘M多情巧用計數

大大老狼發表於2016-07-18

上節講到法國數學家韋達先生,用一個小小的數學公式,使西班牙軍隊陰溝裡翻船。下面。我們將繼續我們的程式之旅,穿越時空,回到遠古的希臘去,去繼續潘M的問題。

enter image description here
圖:宙斯想著自己下達的“千日豆令”,不禁竊喜

2.13.1 P13宙斯千日豆令

在古希臘,據說宙斯是天界的最高統治者。潘多拉公主(第三節人物),諸神因妒忌她的美貌,便說服宙斯送給她一個神祕的盒子,她卻播撒起希望豆。
據說在這個盒子中有一種希望豆,她將希望豆發放了三天,希望它能撒播人間。第一天,她把該希望豆中的一半又多一個發給生活在山上的人們;第二天,把剩下的一半又一個發給平原上的人們;第三天最後剩下的一半又一個豆豆發給海島上生活的人們,到第四天一看,只剩下一個豆豆了,她將這個豆豆永遠留在盒子裡,也使人們希望永留人間。
潘多拉撒豆後不久,在人間的口碑越來越棒,這可激怒了農神,他向宙斯打小報告說,潘多拉靠撒希望豆抬升自己的聲望。宙斯想了另外一個辦法,你不是厲害嗎?我叫你先撒上十年希望豆試一下,但必須天天發,十年就3650天,看你煩不煩!宙斯為自己的聰明主意而竊喜。問題也就出來了:農神要給潘多拉多少希望豆呢?

2.13.2 千日豆令和計數器分析
有兩個問題需要解決,首先,是建立千日的計數器,使一千個日月能夠準確無誤地下去。另外,還需要研究這種千日模式,有沒有一定規律,有沒有聯絡,我們只要把握好它,就可以一勞永逸地繼續下去。
建立規律
先研究第二個問題,連線第三節破解潘MM的盒子,她的神祕盒子中的希望豆,給我們的啟示是:要建立當天和後一天的聯絡。也就是將第4天和第1天建立聯絡,即建立當前天和前一天的關係,他們的關係即“第三天數量/2-1”和第四天相等,因為是已知第四天s4求第三天s3,將關係反過來可用公式s3=2*(s4+1),其他的幾個關係類似。

enter image description here
圖1

再進一步,程式碼也就有了:
s4=1
s3=2*(s4+1)
s2=2*(s3+1)
s1=2*(s2+1)
print s1
問題到了這裡,好象應該結束了。利用賦值的特點,如果將s後的數字去掉,讓我們有柳暗花明又一村的感覺。程式碼得到了進一步簡化:
s=1
s=2*(s+1)
s=2*(s+1)
s=2*(s+1)
print s
瞭解到這裡,我們可以解千日豆令的問題了:農神需要預備多少希望豆呢?撒三天和撒一千天,從方法上差不多。如果將“年”最終要轉化成“天”,十年就是3650天,要撒這麼多天豆,和撒3天有什麼不同嗎?通過三天的潘多拉撒豆,我們不難看出,最後一天還是剩下一個,中間的天數從3天擴充套件到3650天了,那在3天中,中間出現了三條相同的語句s=2*(s+1),那依此類推,千日豆令解題的中間將會出現3650條語句!
s=1
s=2*(s+1)
s=2*(s+1)

s=2*(s+1)
(總計3650條)
print s

怎麼解決呢?我們是不是還要將這種語句在程式中重複鍵入3650條呢?用計數器來默默幫助我們理順上面的關係。
計數器
當然不用重複輸入3650條語句,那樣就太愚蠢了,電腦語言中有另外一種簡潔的方式,它就是可重複的計數器(如圖2)。
enter image description here

圖2
計數器的三個特點:
 開始計數值
 結束計數值
 開始到結束的遞增值

上例中,i從1開始,到3650結束,這還不能保證重複3650天,還有一個隱藏的條件,即從1到3650過程中,每次增加一個值。全寫出來程式碼是:
For i=1 to 3650 step 1
通過這種計數器,可用用迴圈方式,將需要表達的意思簡單化,就是我們變換向電腦描述問題的方式,不再一句一句地和它去對話,而是直接告訴它,請做3650遍吧!
根據圖2,可以想象的程式碼形式如下:
s=1
for i=1 to 3650
s=2*(s+1)
next i
print s

問題到此處原該圓滿結束了,但真刀真槍地到電腦上實驗一下,上面的程式在執行的過程中會出大問題!為什麼呢,因為真要撒3650天,您可以算一下,希望豆豆的數目將會大到連神仙都害怕,這個數會大到1後面有好幾百個0那麼大,用上面的方法,我們的微機是無法用這個程式完成的。
但我們的重點不在這裡,我們的重點是想通過千日豆讓大家體會一下什麼是迴圈。所以,可以看一下20天的希望豆是一種什麼情況?這是個有意思的對比,程式碼如下:
s=1
for i=1 to 20
s=2*(s+1)
next i
print s
上面的程式碼可以很好地在電腦上執行。美妙的重複規律可以用迴圈,需要我們注意的是,迴圈也不是無限制的,且不可超過電腦中限制的最大的放數字的空間,如果真超過了,思路還要發生轉變。

2.13.3 阿蘭開講 :
宙斯的真意是想說:撒三天豆是一種放鬆,撒千天豆是種懲罰!
而面對這種懲罰,潘M魔盒中蘊藏著一顆更有力的“希望之豆”,它就是我們的賦值語句,即形如s=…s…之類的語句,通過它們,可以傳達“形似神不同”的神奇功效。這顆希望豆傳達了順序程式結構和迴圈結構之間的關係。
這種特效,再加上一個理性的計數器,就可以將複雜的有規律的事情進行描述了。記數器與“形似神不似”的有機組合,形成了一種很具創新精神的語言結構形式。
如何將二者結合到一起,關鍵是根據實際情況,找出其規律性。找規律最好的辦法是一個示例一個示例地分析。分析第1種情況,第2種,第3種,…第n種,…最後一種。
這其中,最值得我們注意的一點是,“3”這個數字是我們程式設計中尤其要重視的一個數字,當我們遇到比3的時候,就要思考是不是還要悶頭做下去,遇到超過3的重複的時候,我們首先要想到的是:是否有什麼規律。將這種規律同計數器有機結合整合到一起,程式就跑起來了,附合實際問題的解決方法就出來了。
迴圈是什麼呢?
說白了它就是和下命令的口吻來讓電腦幹活,而不是自己費力地機械地去辛苦地勞做。
這可能也就是電腦和我們人類不同的地方吧,讓電腦以它善長的方式去做,人們以自己善長的方式告迴圈結構:人和電腦各取所需
其實迴圈又象是完全沒有必要的。因為只要有了順序語句和分支,一切問題處理起來就綽綽有餘了。象我家的電話是2222222,您可以怎麼描述呢?我們會說7個2。事實上迴圈的工作和上面的電話號碼有些類似。我們通過儘量少的工作,去表示一個其實仍很完整的事例或意思。象我們下達這樣的命令:讓一個人在家中用筆寫出一億個“人”字,我們沒必要這樣下達,請你寫“人”、“人”、......“人”(說了一億個人)。用好了迴圈,才能真正體會到人和機器的區別。迴圈和前兩類語句的區別在於,迴圈可以很簡單地描述前者重複性的問題。
有了迴圈,才真正體現出程式的意義所在。
迴圈問題本身,一種獨立的可與迴圈問題相合的計數器,二者結合,會成就許多簡潔有效有效思的程式設計故事。 後面,我們的重點問題如何深入研究迴圈。欲知後事如何,且聽下節分解。

2.13.4 小測驗:遺產分配
一位寡婦將同她的即將生產的孩子一起分享她丈夫遺留下來的 3500元遺產。如果生的是兒子,那麼,按照羅馬的法律,做母親的 應分得兒子份額的一半;如果生的是女兒,做母親的就應分得女兒份 額的兩倍。可是發生的事情是,生了一對雙胞胎——一男一女。
 小測驗參考答案:
法律是不能違背的,最重要的是實行母親是兒子一半,女兒是母親一半,將財產先分成五份,女兒得一份,母親兩份,兒子四份,問題就迎刃而解,所以分別是500元,1000元和2000元。

相關文章