說(shuō)在前面
受《新時(shí)代領(lǐng)航技術(shù)同步用書(shū)》編委會(huì)的邀請(qǐng),我也嘗試著編制了一些題目,盡可能按照新課標(biāo)的要求,力求能夠激發(fā)學(xué)生思考和考查學(xué)生的計(jì)算思維。
上次已經(jīng)和大家分享了2道以公民身份證號(hào)碼為背景的題目,試圖從設(shè)計(jì)自定義函數(shù)的角度,幫助學(xué)生初步掌握模塊化編程的方法。由于自定義函數(shù)是編程教學(xué)的重、難點(diǎn),必須多加練習(xí)才能掌握,所以今天繼續(xù)和大家分享2道相同類型的題目。
由于新教材是塊新大陸,我們都是在摸索前行,加之本人水平有限,在描述題目用語(yǔ)和控制題目難度方面都存在不足,敬請(qǐng)大家批評(píng)指正。

8.(開(kāi)放題)小美參加環(huán)保知識(shí)競(jìng)答比賽,回答結(jié)果存儲(chǔ)在字符串中,其中回答正確用'T'表示,回答錯(cuò)誤用'F'表示?;卮疱e(cuò)誤不得分,連續(xù)答對(duì)k題,則第k題加k分。下面的自定義函數(shù)能根據(jù)答案字符串計(jì)算小美的總分?jǐn)?shù)。它的形式參數(shù)ans是一個(gè)只包含'F'和'T'兩種字符的字符串,函數(shù)根據(jù)得分規(guī)則和答案字符串計(jì)算出的總分?jǐn)?shù)。例如,當(dāng)ans='FTTTFTTFFT'時(shí),函數(shù)返回10;當(dāng)ans='TTTTFFTFTF'時(shí),函數(shù)返回12。請(qǐng)認(rèn)真閱讀代碼,回答如下問(wèn)題:(2)當(dāng)ans='FFFTTTTTFF'時(shí),函數(shù)返回值是多少?(3)除了題目給出的代碼,你能用其他方式實(shí)現(xiàn)自定義函數(shù)get_score(ans)嗎?

解析:本題考查自定義函數(shù)、字符串處理和計(jì)數(shù)方法。(1)根據(jù)題意可知變量k和s分別用來(lái)存儲(chǔ)當(dāng)前答題得分和總分?jǐn)?shù),它們的初始值均為0。因?yàn)檫B續(xù)答對(duì)k題,第k題加k分,最終返回總分,故第①空答案為s + k,第②空答案為0。 調(diào)用函數(shù)時(shí),我們只需在函數(shù)名后面的圓括號(hào)里填寫(xiě)實(shí)參ans即可。(2)當(dāng)ans='FFFTTTTTFF'時(shí),s = 1+2+3+4+5 = 15,即函數(shù)返回值為15。(3)根據(jù)連續(xù)連續(xù)答對(duì)k題,則第k題加k分的算法,我們可以使用公式s = k * (k +1) / 2來(lái)計(jì)算連續(xù)答對(duì)k題的總分。我們可以存儲(chǔ)字符串的總長(zhǎng)度,設(shè)置外層while循環(huán)條件為i < n,然后在內(nèi)層循環(huán)中跳過(guò)字符'F',然后使用while循環(huán)記錄連續(xù)出現(xiàn)子串'T'的數(shù)量,并根據(jù)公式計(jì)算得分,參考代碼如下:算法1:存儲(chǔ)字符串的總長(zhǎng)度,設(shè)置外層while循環(huán)條件為i < ndef get_score2(ans): s, i, n = 0, 0, len(ans) while i < n: while i < n and ans[i] == 'F': i += 1 p = i #記錄當(dāng)前'T'子串的起始位置 while i < n and ans[i] == 'T': i += 1 s += (i - p) * (i - p + 1) // 2 return s
為了進(jìn)一步提高程序效率,我們可以為字符串增加一個(gè)結(jié)束符'.'(或除'FT'以外的其他字符)作為“哨兵”,這樣在遍歷字符串時(shí),就可以將外層while循環(huán)條件寫(xiě)成ans[i] !='.'。有了“哨兵”以后,在內(nèi)層循環(huán)中就無(wú)需判斷下標(biāo)是否越界,提高了程序效率。算法2:為字符串增加一個(gè)結(jié)束符,可以進(jìn)一步提高程序效率。
def get_score3(ans): ans += '.' #為字符串增加一個(gè)結(jié)束符 s, i = 0, 0 while ans[i] != '.': while ans[i] == 'F':#跳過(guò)'F'子串 i += 1 p = i #記錄當(dāng)前'T'子串的起始位置 while ans[i] == 'T': i += 1 s += (i - p) * (i - p + 1) / 2 return s
10.(開(kāi)放題)隨機(jī)數(shù)可以用于數(shù)學(xué),游戲,安全等領(lǐng)域中,還經(jīng)常被嵌入到算法中,用以提高算法效率,并提高程序的安全性。Python提供了random模塊來(lái)生成隨機(jī)數(shù),它的randint(),randrange(),choice()和sample()等方法都可以生成一個(gè)或多個(gè)隨機(jī)數(shù)。例如下面的列表生成式就可以很方便的生成一個(gè)長(zhǎng)度為10的隨機(jī)數(shù)序列,其元素值為[1, 10]區(qū)間的隨機(jī)整數(shù):a = [random.randint(1,10) for i in range(10)]
可是,這樣的一個(gè)隨機(jī)數(shù)列表中的元素值常常會(huì)出現(xiàn)重復(fù)。現(xiàn)在我們需要提高難度,要求生成一個(gè)長(zhǎng)度為n的列表,其元素值為[a, b]區(qū)間的不重復(fù)的隨機(jī)整數(shù)。
請(qǐng)根據(jù)以下對(duì)自定義函數(shù)特征的描述,寫(xiě)出完整代碼,實(shí)現(xiàn)函數(shù)功能。
提示:可充分使用random模塊中各種生成隨機(jī)數(shù)的方法,爭(zhēng)取寫(xiě)出3-4種不同的算法。
函數(shù)功能:生成n個(gè)[a, b]區(qū)間的的隨機(jī)整數(shù),并存儲(chǔ)到列表中函數(shù)名:rand_int_1(n, a, b)參數(shù)表:n--不重復(fù)隨機(jī)整數(shù)的數(shù)量,即列表長(zhǎng)度 a, b--不重復(fù)的隨機(jī)整數(shù)分布區(qū)間的左右邊界值返回值:返回存儲(chǔ)了n個(gè)不重復(fù)隨機(jī)整數(shù)的列表
需要本文word版和拓展思考答案的,可以加入“Python算法之旅”知識(shí)星球參與討論和下載文件,“Python算法之旅”知識(shí)星球匯集了數(shù)量眾多的同好,更多有趣的話題在這里討論,更多有用的資料在這里分享。
我們專注Python算法,感興趣就一起來(lái)!
相關(guān)優(yōu)秀文章:
閱讀代碼和寫(xiě)更好的代碼
最有效的學(xué)習(xí)方式
函數(shù)與模塊典型例題