王德貴
勾股定理是大家熟知的,勾股數(shù),就是構(gòu)成勾股定理的三個數(shù),即一個數(shù)的平方是另外兩個數(shù)的平方和。比如,32+42=52,那么3、4、5就是勾股數(shù)。那么在一定范圍內(nèi),有多少勾股數(shù)呢?我們在Scratch、Python和Applnventor_種環(huán)境中編程解答這一問題,并著重關(guān)注程序在不同環(huán)境中的運行效率。
本例可以考慮3個數(shù),都從1開始用枚舉法來解決問題,但這種方法循環(huán)次數(shù)最多,100以內(nèi)的勾股數(shù)就需要計算1003=106,100萬次!根據(jù)測算Scratch中運行要至少3分鐘,Python運行不到1分鐘,Applnventor運行大約需要1分鐘,可見,它們各自運行的速度是不一樣的。當(dāng)然這主要是由程序語言決定的,Python運行最快,Scratch最慢。
那么怎樣能夠減少運算量呢?新的思路是根據(jù)天系式a2+b2=C2可知,先確定c的值,那么a和b的值一定小于c,所以循環(huán)到等于即可,這樣就不用循環(huán)到最大值,從而減少運行時間。
我們把滿足勾股定理的3個數(shù),加入鏈表,然后顯示出來,這個比較好理解。但運行后發(fā)現(xiàn),有重復(fù)的項(比如3、4、5和4、3、5),共104項實際應(yīng)為52項,說明恰好重復(fù)2次,那有辦法去除重復(fù)的項目嗎?
我們把每個c值加入鏈表,然后在下次得到滿足條件的值時,就查詢一下,這幾個值在不在鏈表里:在,就是重復(fù),不加入鏈表:不在鏈表里,那就加入進(jìn)來!這樣就不會有重復(fù)的數(shù)據(jù)了。
這段代碼的作用就是去重。如果a.b都包含在鏈表里,就說明是重復(fù)數(shù)據(jù),所以就做下標(biāo)記0:如果a.b都不包含在鏈表里,就說明沒有重復(fù)數(shù)據(jù),于是就將數(shù)據(jù)加入鏈表f去重后,顯示正常為52個。程序測算通過。
Python程序的思路和Scratch編程類似,基本程序如下,但依然有重復(fù)的數(shù)據(jù)。
所以仍然需要去重,在Python中,去重最簡單的當(dāng)數(shù)集合!這個和高中數(shù)學(xué)知識基本一樣的,其特點有二=:“確定性:對于任意一個元素,要么它屬于某個指定集合,要么它不屬于該集合,二者必居其一。互異性:同一個集合中的元素是互不相同的。無序性:任意改變集合中元素的排列次序,它們?nèi)匀槐硎就粋€集合?!?p>
定義空集m=se“),雖然元素是放在大括號里,但定義m={}是定義了一個字典,不是集合,但如果定義m={3,4,5}卻是集合,這一點要特別注意。
可以拓展為任意范圍內(nèi)的勾股數(shù),通過鍵盤輸入,確定最大和最小值??梢郧蟪鋈我夥秶鷥?nèi)的勾股數(shù)。
Applnventor設(shè)計的程序,編寫難度低又可以在手機上運行,這是它受到歡迎的原因之一。
編程思路與Python不同,與Scratch類似,需要將滿足條件的值加入列表中,同時判斷在同一循環(huán)中,滿足條件的元素是否在列表中,以達(dá)到去重的目的。
手機上運行測試,可以得到我們想要的結(jié)果。程序需要輸入求值范圍,如果范圍最大值不大于最小值,就提示錯誤,需要重新輸入。
三種方法其實都要使用列表,算法也類似,但在Python中,集合是更簡便、快捷的方法。通過二種編程環(huán)境和應(yīng)用的比較,Python比Scratch要優(yōu)化很多,Applnventor編程有它獨有的特點,就是可以在手機上和其他應(yīng)用一樣使用。
希望大家可以通過二款軟件的比較,掌握各自的特點和實用性,為進(jìn)一步學(xué)習(xí)提供參考和幫助。