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