官术网_书友最值得收藏!

8.1 考拉茲猜想的實(shí)驗(yàn)驗(yàn)證

現(xiàn)在我們來(lái)編程驗(yàn)證這個(gè)猜想,驗(yàn)證程序需要完成三個(gè)任務(wù):

(1)驗(yàn)證這個(gè)猜想在10000以內(nèi)是否都成立。

(2)記錄每一個(gè)數(shù)各經(jīng)過(guò)多少次運(yùn)算才回到1,并在二維圖上打一個(gè)點(diǎn),水平軸表示數(shù)本身,垂直軸表示運(yùn)算次數(shù),比如前面我們驗(yàn)證過(guò)的13,經(jīng)過(guò)9次運(yùn)算回到1,那么就在(13,9)這個(gè)位置標(biāo)一個(gè)點(diǎn)。

(3)如果某個(gè)數(shù)經(jīng)過(guò)若干次運(yùn)算以后,又回到它自己,那么會(huì)構(gòu)成一個(gè)循環(huán),一直不會(huì)結(jié)束,程序需要防止出現(xiàn)這種情況。

分析:

每次核算一次一個(gè)數(shù)是否能歸一,可能需要多次運(yùn)算,而且每計(jì)算一次,計(jì)數(shù)器還要加1,最終返回總運(yùn)算次數(shù)。可以用一個(gè)函數(shù)來(lái)完成這兩項(xiàng)工作,這個(gè)函數(shù)接收一個(gè)輸入,返回是否歸一以及計(jì)算次數(shù)。

計(jì)算結(jié)果可以存入一個(gè)列表里面,列表的索引就是這個(gè)數(shù),列表里存儲(chǔ)運(yùn)算次數(shù)。

可以用模塊matplotlib來(lái)進(jìn)行繪圖,第9章專門(mén)講述matplotlib。

代碼如下:

這個(gè)程序有幾處新的Python知識(shí)點(diǎn):

(1)import…as…句法,該語(yǔ)句的意思就是使用as之后的變量名來(lái)引用這個(gè)模塊。其好處是在程序中對(duì)模塊的引用變得簡(jiǎn)潔,在程序中本來(lái)應(yīng)該使用matplotlib.pyplot這個(gè)變量名,現(xiàn)在全部簡(jiǎn)寫(xiě)為plt。

(2)第24行,我們的函數(shù)調(diào)用方式是testResult,times=collatz(i),collatz()返回兩個(gè)變量,因此賦值表達(dá)式的左邊有兩個(gè)變量。

(3)第22行,定義了一個(gè)空的列表,第26行、28行通過(guò)列表函數(shù)append()往列表尾巴上添加一個(gè)新的元素。

(4)第30~33行用matplotlib畫(huà)圖(見(jiàn)圖8-1),這個(gè)模塊的內(nèi)容很豐富,下一章專門(mén)講如何用matplotlib來(lái)畫(huà)圖。本例中,fig=plt.figure(1)創(chuàng)建一個(gè)圖,此時(shí)圖中還沒(méi)有任何東西。

ax=fig.add_subplot(1,1,1),在這個(gè)圖上只畫(huà)一個(gè)坐標(biāo)平面ax,ax.scatter(range(1,10 000),L,color='r',marker='.'),在ax這個(gè)坐標(biāo)平面上畫(huà)一個(gè)散點(diǎn)圖,range(1,10 000),說(shuō)明X軸從1一直到10 000,每次增加1,參數(shù)L中存放從1到10 000的每個(gè)數(shù)字經(jīng)過(guò)多少次運(yùn)算才歸一。color='r'指定散點(diǎn)顏色是紅色,marker='.'指定點(diǎn)的形狀就是個(gè)圓點(diǎn)。

圖8-1 圖形化結(jié)果

圖8-1的橫坐標(biāo)表示1~10 000的每一個(gè)數(shù)字,縱坐標(biāo)是X軸對(duì)應(yīng)的數(shù)字經(jīng)過(guò)多少次運(yùn)算后才歸一,圖形上看明顯展示出了魚(yú)鱗狀的規(guī)律性。

主站蜘蛛池模板: 高邑县| 丹寨县| 蓝山县| 罗山县| 隆安县| 胶州市| 满城县| 昂仁县| 松阳县| 克东县| 平顶山市| 高要市| 大港区| 寻乌县| 盐津县| 武清区| 彭州市| 海原县| 西藏| 科尔| 尚义县| 泌阳县| 三都| 柳州市| 崇文区| 麟游县| 海淀区| 天柱县| 富民县| 大兴区| 新兴县| 彰化县| 静乐县| 内江市| 东安县| 楚雄市| 广宗县| 青海省| 垦利县| 康平县| 琼中|