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