新教材習(xí)題解析之python循環(huán)結(jié)構(gòu)
說(shuō)在前面
下學(xué)期開(kāi)始,絕大多數(shù)學(xué)校就要開(kāi)始上新教材內(nèi)容了,必修一《數(shù)據(jù)與計(jì)算》的主要內(nèi)容是Python語(yǔ)言學(xué)習(xí)。新教材的理念是編程教學(xué)不應(yīng)該只教語(yǔ)法,更重要的是教學(xué)生如何解決問(wèn)題,如何使用計(jì)算機(jī)編程解決實(shí)際問(wèn)題。所以命題的思路不應(yīng)該是摳語(yǔ)法,應(yīng)盡量避免考查語(yǔ)法細(xì)節(jié),要把重點(diǎn)放在數(shù)學(xué)建模和解決問(wèn)題上面。
受《新時(shí)代領(lǐng)航技術(shù)同步用書(shū)》編委會(huì)的邀請(qǐng),我也嘗試著編制了一些題目,盡可能按照新課標(biāo)的要求,力求能夠激發(fā)學(xué)生思考和考查學(xué)生的計(jì)算思維。今天主要和大家分享2道關(guān)于Python循環(huán)結(jié)構(gòu)的開(kāi)放性題目。
由于新教材是塊新大陸,我們都是在摸索前行,加之本人水平有限,在描述題目用語(yǔ)和控制題目難度方面都存在不足,敬請(qǐng)大家批評(píng)指正。

例4.(開(kāi)放題)計(jì)算S = 1/4 + 1/16 + 1/64+ 1/256 + …的值。
(1)這道題目是求無(wú)窮級(jí)數(shù)的和,其各項(xiàng)的變化規(guī)律是什么?
(2)設(shè)計(jì)算法要遵循有窮性原則,在本題中不能讓程序永遠(yuǎn)執(zhí)行下去,你打算如何設(shè)計(jì)算法以避免出現(xiàn)死循環(huán)?
(3)請(qǐng)編寫(xiě)程序?qū)崿F(xiàn)你設(shè)計(jì)的算法,并添加必要的注釋。
(4)除了編程計(jì)算S的值,你是否還能想到其他的巧妙方法?

解析:(1)各項(xiàng)的變化規(guī)律是:第n項(xiàng)的值為4的n次冪的倒數(shù)。
(2)我們可以發(fā)現(xiàn)當(dāng)n越大時(shí),該項(xiàng)對(duì)S的影響越小。故可以通過(guò)設(shè)置n的值來(lái)控制循環(huán)的次數(shù),或者比較相鄰的兩項(xiàng)的值,當(dāng)它們的差值小于某個(gè)數(shù)時(shí),說(shuō)明S的精確度已經(jīng)很高了,可以退出循環(huán)。
(3)算法1:我們可以發(fā)現(xiàn),當(dāng)n=30時(shí),1/4^30的數(shù)量級(jí)為10^(-19),這是一個(gè)非常小的數(shù)了,所以我們可以讓循環(huán)執(zhí)行30次,就可以得到S較為精確的值。參考代碼如下:
s = 0
#計(jì)算前30項(xiàng),即可獲得較為精確的S值
for i in range(1, 31):
s += 1 / 4 **i #或s += 4 ** -i
print(s)
算法2:我們可以規(guī)定當(dāng)相鄰兩項(xiàng)的差小于10^(-20)時(shí)退出循環(huán),這樣也能獲得精確度已經(jīng)很高的S值。參考代碼如下:
s = 0
d = 10 ** -20 #最小差值
a, b = 1/4, 1/16#前兩項(xiàng)
#當(dāng)相鄰兩項(xiàng)的差小于d時(shí)退出循環(huán)
while a - b >= d:
s += a
a, b = b, b / 4
print(s)
(4)除了編程計(jì)算S的值,我們還可以使用等比數(shù)列求和公式來(lái)計(jì)算S的值。因?yàn)榈缺葦?shù)列的公比q=1/4,故當(dāng)n值很大時(shí)q^n約等于0,故可以將求和公式簡(jiǎn)寫(xiě)為S=a1/(1-q),代入數(shù)據(jù)得到S=1/3。
還可以使用作圖法來(lái)解決本題。如下圖所示,畫(huà)一個(gè)平分為4份的正方形,將正方形的右上角的1/4部分再次劃分為4份,以此類推。可知每個(gè)黑色的小正方形面積剛好依次為1/4,1/16,1/64,…。而黑色部分面積剛好是總面積的1/3,故S=1/3。

拓展思考:
11.(開(kāi)放題)“海龜作圖”是一款神奇的軟件,只需簡(jiǎn)單的幾行代碼,就可以畫(huà)出各種復(fù)雜的圖形,有時(shí)候只要更改一下畫(huà)筆轉(zhuǎn)折的角度,就能做出各種不同的漂亮圖形。在下面的程序中,我們用變量angle存儲(chǔ)畫(huà)筆轉(zhuǎn)折的角度,以下就是角度angle分別為90,120和144時(shí)作出的圖形。

你知道如此美妙的圖案是如何畫(huà)出來(lái)的嗎?
下面的代碼能夠?qū)崿F(xiàn)上述功能,請(qǐng)仔細(xì)閱讀代碼,回答以下問(wèn)題,并思考能否修改參數(shù)angle或者修改代碼,畫(huà)出更多漂亮的圖形。
(1)變量w中存儲(chǔ)的值用來(lái)表示什么?若將其初值設(shè)置成50,圖像有何變化?
(2)內(nèi)層循環(huán)變量j可以取到哪些值?若將語(yǔ)句for j in range(6)改成for j in range(10)會(huì)對(duì)程序產(chǎn)生什么影響?
(3)內(nèi)層循環(huán)中語(yǔ)句w = w+ 2的作用是什么?若將其改成w = w + 10,圖像會(huì)有何變化?
(4)修改參數(shù)angle的值分別為60,150和180,觀察生成的圖像,你能想象出angle=180時(shí)的圖像是什么樣子的嗎?
import turtle as tt
tt.TurtleScreen._RUNNING = True # 啟動(dòng)繪圖,在IDE中運(yùn)行加這句可避免報(bào)錯(cuò)
c = [(18,242,13), (255,0,0), (136,209,46), (132,104,22),(0,200,200), (243,236,86)]
tt.ht()
tt.speed(0)
tt.colormode(255)
w = 5 #①
angle = 144
tt.pensize(2)
for i in range(20):
for j in range(6): #②
tt.pencolor(c[j])#設(shè)置不同顏色
tt.fd(w)
tt.rt(angle)
w = w + 2 #③
tt.done()
需要本文word版和拓展思考答案的,可以加入“Python算法之旅”知識(shí)星球參與討論和下載文件,“Python算法之旅”知識(shí)星球匯集了數(shù)量眾多的同好,更多有趣的話題在這里討論,更多有用的資料在這里分享。
我們專注Python算法,感興趣就一起來(lái)!
相關(guān)優(yōu)秀文章:
