最近繼續(xù)游走在敲代碼的路上啄踊,越往深了學(xué)忧设,越是發(fā)現(xiàn)編程和數(shù)學(xué)有著密不可分的關(guān)系。
印度有一個(gè)古老的傳說:在世界中心貝拿勒斯(在印度北部)的圣廟里颠通,一塊黃銅板上插著三根寶石針址晕。印度教的主神梵天在創(chuàng)造世界的時(shí)候,在其中一根針上從下到上地穿好了由大到小的64片金片顿锰。不論白天黑夜谨垃,總有一個(gè)僧侶在按照下面的法則移動(dòng)這些金片:一次只移動(dòng)一片,不管在哪根針上硼控,小片必須在大片上面刘陶。僧侶們預(yù)言,當(dāng)所有的金片都從梵天穿好的那根針上移到另外一根針上時(shí)牢撼,世界就將在一聲霹靂中消滅匙隔,而梵塔、廟宇和眾生也都將同歸于盡熏版。
聽了這個(gè)故事纷责,你是不是覺得似曾相識(shí),和小時(shí)候玩過的一款游戲很像撼短。沒錯(cuò)再膳,這個(gè)故事就是益智類游戲——漢諾塔的由來(lái)。
游戲規(guī)則如下:
有三根桿子A曲横,B喂柒,C。A桿上有N個(gè)(N>1)穿孔圓盤,盤的尺寸由下到上依次變小胳喷。要求按下列規(guī)則將所有圓盤移至C桿:
- 每次只能移動(dòng)一個(gè)圓盤湃番;
- 大盤不能疊在小盤上面。
提示:可將圓盤臨時(shí)置于B桿吭露,也可將從A桿移出的圓盤重新移回A桿吠撮,但都必須遵循上述兩條規(guī)則。
問:如何移讲竿?最少要移動(dòng)多少次泥兰?
記得小時(shí)候最早接觸這道數(shù)學(xué)題的時(shí)候花了不少心思,當(dāng)時(shí)不懂遞歸题禀,只會(huì)用笨辦法鞋诗,即挨個(gè)試。從2個(gè)盤迈嘹,3個(gè)盤削彬,4個(gè)盤開始推演,算完4個(gè)盤的時(shí)候秀仲,感覺摸到點(diǎn)規(guī)律了:2個(gè)盤的時(shí)候是3次融痛,3個(gè)盤的時(shí)候是7次,4個(gè)盤的時(shí)候是15次神僵。結(jié)果看上去都是奇數(shù)雁刷,而且似乎都跟2^n (n是盤子的數(shù)量)有關(guān)系,于是就大膽猜測(cè)答案是2^n-1保礼。然后再套用到5個(gè)盤上去驗(yàn)證沛励,果然如此,答案是正確的炮障。
現(xiàn)如今目派,在學(xué)編程時(shí)又遇上了同樣的問題,這一回不用再用笨辦法了铝阐,直接上代碼:
def move(n, a, b, c):
if n == 1:
print('move', a, '-->', c)
else:
move(n-1, a, c, b)
move(1, a, b, c)
move(n-1, b, a, c)
move(3, 'A', 'B', 'C')
move A --> C
move A --> B
move C --> B
move A --> C
move B --> A
move B --> C
move A --> C
計(jì)算機(jī)在邏輯運(yùn)算方面確實(shí)有過人之處址貌,通過編程,我們也看到了數(shù)學(xué)之美徘键。
讓我們?cè)倩剡^頭去看看那個(gè)古老的印度傳說练对,很多人真把它當(dāng)作是傳說在看,并且一笑了之吹害。而如果你從數(shù)學(xué)的角度去看螟凭,就會(huì)發(fā)現(xiàn)它不是一個(gè)傳說,因?yàn)?的64次方-1真的是個(gè)很大的數(shù)字它呀,等于18446744073709551616螺男,如果單位是秒的話棒厘,約等于5845.54億年。想想地球才多大歲數(shù)下隧,科學(xué)家說至今不過45億年罷了奢人。真要過了5845.54億年,別說地球淆院,太陽(yáng)系可能都玩完兒了何乎,梵塔、廟宇和眾生當(dāng)然也早就灰飛煙滅了土辩。
所以支救,從這個(gè)角度看過去,學(xué)點(diǎn)數(shù)學(xué)拷淘,學(xué)點(diǎn)編程對(duì)于我們認(rèn)識(shí)世界還是有很大幫助的各墨,至少可以分清什么是傳說,什么是事實(shí)启涯。