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

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

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