丁大為 王德貴
通過前期的文章,我們了解了“數(shù)學(xué)黑洞6174”,也確實(shí)感到了數(shù)學(xué)中的玄妙??ㄆ绽卓枺↘aprekar)黑洞,又稱重排求差黑洞,其計(jì)算過程稱為卡普雷卡爾運(yùn)算,這個(gè)現(xiàn)象稱歸斂,“6174”稱歸斂結(jié)果。四位數(shù)的黑洞是“6174”,那三位數(shù)有同樣的黑洞嗎?
今天我們用Python來求解和驗(yàn)證。
數(shù)學(xué)黑洞問題,經(jīng)過幾天的研究,真的感覺很有意思,那么除了四位數(shù)的6174,三位數(shù)、五位數(shù)是不是也有類似的規(guī)律呢,這期分享三位數(shù)的黑洞。
找到三位數(shù)的數(shù)學(xué)黑洞是一個(gè)求解和驗(yàn)證的問題,也要解決以下三個(gè)問題。
一是輸入任意一個(gè)三位數(shù)(不包含全部相同的數(shù)字),驗(yàn)證最后經(jīng)過運(yùn)算是不是得到一個(gè)固定的值;二是在一定范圍內(nèi),是不是所有數(shù)都能得到這個(gè)固定值;三是要得到這個(gè)值最多需要多少步驟。
思路與四位數(shù)驗(yàn)證一樣,首先要將三位數(shù)分解開單個(gè)數(shù)字,存儲(chǔ)在新列表中,然后排序列表,輸出最大和最小數(shù),做差,然后再存儲(chǔ)在新列表中,循環(huán)操作,看看最后是不是得到一個(gè)固定的值。
程序涉及的是中國電子學(xué)會(huì)編程等級考試四級知識點(diǎn)。
1.求解
即求解三位數(shù)的歸斂結(jié)果,是什么樣的數(shù)據(jù)。
參照四位數(shù)驗(yàn)證方法,程序設(shè)計(jì)(如圖1)。
將輸入的三位數(shù)轉(zhuǎn)化為列表,然后判斷數(shù)字是否完全相同,如果不完全相同,則循環(huán)執(zhí)行將列表中的三個(gè)數(shù)字排序,取出最大和最小的數(shù),做差,在屏幕上顯示出來,同時(shí)添加到列表m中,如果有歸斂結(jié)果,則會(huì)有重復(fù)數(shù)據(jù),于是判斷列表的長度和轉(zhuǎn)換為集合后的長度比較,如果不相等,則輸出最后一個(gè)數(shù)據(jù),即為歸斂結(jié)果。
比如輸入:123,運(yùn)行結(jié)果(如圖2)。
大家可以看到,歸斂結(jié)果為495!那其他三位數(shù)也是歸斂結(jié)果嗎?下面我們來驗(yàn)證一下。
2.驗(yàn)證
即是輸入任意一個(gè)數(shù)字不完全相同的三位數(shù),進(jìn)行驗(yàn)證,看看能不能得到495,需要幾步。這里利用了自定義函數(shù)。
(1)遞推法
輸入一個(gè)三位數(shù),但三個(gè)數(shù)字不能完全相同,將其轉(zhuǎn)換為列表,排序、連接、轉(zhuǎn)換出最大值和最小值,做差,再轉(zhuǎn)換為列表,如果不夠3位,則添加“0”,進(jìn)行下一輪循環(huán),直到得到“495”,然后輸出轉(zhuǎn)換用了多少次(如圖3)。比如驗(yàn)證輸入123,5次后獲得結(jié)果495。
(2)遞歸法
遞歸與遞推的不同之處,是調(diào)用了自身,達(dá)到循環(huán)的目的。過程和方法與遞推類似。不同的是,遞推算法中第7行的n=0去掉了,這是因?yàn)槿绻由线@行,每次調(diào)用自身的時(shí)候,n都會(huì)歸0,不能計(jì)數(shù),因而必須先設(shè)置n=0,然后在自定義函數(shù)中用“global n”。兩種方法驗(yàn)證的結(jié)果是完全一樣的(如圖4)。
3.范圍
即是驗(yàn)證一定范圍內(nèi)所有數(shù)字不完全相同的三位數(shù),看看能不能得到495,在這個(gè)范圍內(nèi)需要最多的步數(shù)是多少。
(1)遞推法
通過遞推法驗(yàn)證(如圖5)。
下面是在100-999范圍內(nèi)的遞推法驗(yàn)證,即所有三位數(shù)的驗(yàn)證結(jié)果。在數(shù)字完全一樣時(shí),給出提示,從驗(yàn)證結(jié)果看,所有不完全相同的三位數(shù),經(jīng)過運(yùn)算均可以得到“495”,并運(yùn)算的最多次數(shù)是“6”(如圖6)。
(2)遞歸法
遞歸法和遞推法一樣,也是在驗(yàn)證的基礎(chǔ)上,驗(yàn)證一定范圍內(nèi)的所有整數(shù),經(jīng)過運(yùn)算是不是都能得到“495”,并輸出最多的運(yùn)算次數(shù)。不同的是遞歸是通過調(diào)用自身,達(dá)到循環(huán)的目的。
同樣,遞歸法需要將遞推算法中的n=0去掉,而在遍歷前設(shè)置n=0,然后在自定義函數(shù)中設(shè)置為“global n”。m為最大次數(shù)變量(如圖7)。
下面是在100-999范圍內(nèi)的遞歸法驗(yàn)證,即所有三位數(shù)的驗(yàn)證結(jié)果。在數(shù)字完全一樣時(shí),給出提示,從驗(yàn)證結(jié)果看,所有不完全相同的三位數(shù),經(jīng)過運(yùn)算均可以得到“495”,并運(yùn)算的最多次數(shù)是“6”(如圖8)。
我們看到,兩種方法的驗(yàn)證結(jié)果是完全一樣的。
通過驗(yàn)證,遞推和遞歸方法得出的結(jié)果完全相同。這是在“6174”驗(yàn)證的基礎(chǔ)上,修改程序后,比較容易得到的。那你注意到三位數(shù)和四位數(shù)在驗(yàn)證的時(shí)候,有什么相同點(diǎn)和不同點(diǎn)嗎?
我們只用Python做了驗(yàn)證,有興趣的老師和同學(xué)可以參考“6174”的方法用Scratch和APPInventor去驗(yàn)證。
本文是我自己的研究過程和心得,有不妥之處,請各位老師和同學(xué)斧正!