陳新龍
數學的思維方式是編程的基礎,今天和大家分享一道Scratch考級原題,我們一起來剖析列表背后的數學思維,探尋編程世界中的奧秘吧。
題目:小明同學想要做一個撲克牌游戲,他在卡牌列表中存了A、2、3……J、Q、K,表示撲克牌。程序運行后隨機從卡牌列表中抽取三個數字,并將三個數值存入列表A中。小明想通過系統自動判斷這三張牌是否為連續數字(順子)。那么請你通過Scratch編程來幫助小明完成這個功能吧。
K和A兩張牌不算連續,例如3、4、5屬于連續的三個數字;每次運行代碼后,小明首先會說出列表中抽取了哪三張卡牌,然后根據卡牌的結果判斷三張牌是否連續的數字。答案為三個數是連續的/三個數不是連續的。
很多同學對于這樣的題目,可能感覺無從下手,我們首先需要理解題目的意思,讀懂題目并能將題目抽象轉換為數學問題,是一項非常重要的能力。將題目簡單化其實就是從1-13數字中,隨機抽選三個數字,判斷三個數字是否連續。那么如何判斷三個數字是否連續呢?這是這道題目的考點。
具體方法有很多,第一種方法,尋找最大值和最小值,例如【4、3、5】這三個數字我們都能很直觀地判斷是連續的,最小值和最大值相差2就能確定三個數連續。轉化為任意【a、b、c】三個數字,如果是連續的,那么必然有最大值減去最小值等于2,反之則不連續。
第二種方法,可以表述為如果符合公式:(最大值+最小值)=中間值×2,則為連續數。
第三種方法,先用排序法,將抽取的三個數字進行排序,再判斷第一個數和第三個數差值是否為2即可,這個思路的本質和尋找最大值最小值一樣。其實解決題目方法的本質就是將陌生的問題轉化為已經熟悉的問題。
編寫程序時我們就可以按照上述分析的思路選擇自己熟悉的方法進行編寫。
首先將1-13數字添加至卡組列表中,并且將數列中數字1、11、12、13替換為A、J、Q、K四個字母,卡組列表創建完成(如圖1)。
新增兩個列表A和列表B用于存放抽取的卡牌。通過三次循環,隨機將卡組列表1-13項中抽取到的數字添加入列表A中,考慮到抽卡的過程中可能會出現字母卡牌,于是通過循環替換的方式將列表A中的字母替換回對應的數字存入列表B中(如圖2)。
在列表B中設置最大值MAX和最小值MIN為第一項,通過循環對比的方式尋找出列表中最大值和最小值,將兩個數字相減判斷結果是否等于2,如果結果等于2表示三個數字是連續的,否則的話三個數字不是連續的。當然大家也可以嘗試利用排序的方法來判斷是否三個數字是連續的,這里小陳老師也就不再演示了(如圖3)。
通過本題,我們不難發現其實解決問題的本質就是將陌生的問題轉為為我們熟悉的問題,這種思維不僅在學習編程方面,還有在學習數學中都是非常有用的,也是鍛煉我們問題解決能力的關鍵點。
