新教材习题解析之python循环结构

共 2631字,需浏览 6分钟

 ·

2021-06-22 06:04

说在前面

下学期开始,绝大多数学校就要开始上新教材内容了,必修一《数据与计算》的主要内容是Python语言学习。新教材的理念是编程教学不应该只教语法,更重要的是教学生如何解决问题,如何使用计算机编程解决实际问题。所以命题的思路不应该是抠语法,应尽量避免考查语法细节,要把重点放在数学建模和解决问题上面。

受《新时代领航技术同步用书》编委会的邀请,我也尝试着编制了一些题目,尽可能按照新课标的要求,力求能够激发学生思考和考查学生的计算思维。今天主要和大家分享2道关于Python循环结构的开放性题目。

由于新教材是块新大陆,我们都是在摸索前行,加之本人水平有限,在描述题目用语和控制题目难度方面都存在不足,敬请大家批评指正。



4.(开放题)计算S = 1/4 + 1/16 + 1/64+ 1/256 + …的值。

1)这道题目是求无穷级数的和,其各项的变化规律是什么?

2)设计算法要遵循有穷性原则,在本题中不能让程序永远执行下去,你打算如何设计算法以避免出现死循环?

3)请编写程序实现你设计的算法,并添加必要的注释。

(4)除了编程计算S的值,你是否还能想到其他的巧妙方法?



解析:(1各项的变化规律是:第n项的值为4n次幂的倒数

2)我们可以发现当n越大时,该项对S的影响越小。故可以通过设置n的值来控制循环的次数,或者比较相邻的两项的值,当它们的差值小于某个数时,说明S的精确度已经很高了,可以退出循环。

3)算法1:我们可以发现,当n=30时,1/4^30的数量级为10^(-19),这是一个非常小的数了,所以我们可以让循环执行30次,就可以得到S较为精确的值。参考代码如下:

s = 0

#计算前30项,即可获得较为精确的S

for i in range(1, 31):

    s += 1 / 4 **i  #s += 4 ** -i

print(s)

算法2:我们可以规定当相邻两项的差小于10^(-20)时退出循环,这样也能获得精确度已经很高的S值。参考代码如下:

s = 0

d = 10 ** -20 #最小差值

a, b = 1/4, 1/16#前两项

#当相邻两项的差小于d时退出循环

while a - b >= d:

    s += a

    a, b = b, b / 4

print(s)

         4)除了编程计算S的值,我们还可以使用等比数列求和公式来计算S的值。因为等比数列的公比q=1/4,故当n值很大时q^n约等于0,故可以将求和公式简写为S=a1/(1-q),代入数据得到S=1/3

         还可以使用作图法来解决本题。如下图所示,画一个平分为4份的正方形,将正方形的右上角的1/4部分再次划分为4份,以此类推。可知每个黑色的小正方形面积刚好依次为1/41/161/64。而黑色部分面积刚好是总面积的1/3,故S=1/3


拓展思考:

11.(开放题)“海龟作图”是一款神奇的软件,只需简单的几行代码,就可以画出各种复杂的图形,有时候只要更改一下画笔转折的角度,就能做出各种不同的漂亮图形。在下面的程序中,我们用变量angle存储画笔转折的角度,以下就是角度angle分别为90,120144时作出的图形。


你知道如此美妙的图案是如何画出来的吗?

下面的代码能够实现上述功能,请仔细阅读代码,回答以下问题,并思考能否修改参数angle或者修改代码,画出更多漂亮的图形。

1)变量w中存储的值用来表示什么?若将其初值设置成50,图像有何变化?

2)内层循环变量j可以取到哪些值?若将语句for j in range(6)改成for j in range(10)会对程序产生什么影响?

3)内层循环中语句w = w+ 2的作用是什么?若将其改成w = w + 10,图像会有何变化?

4)修改参数angle的值分别为60150180,观察生成的图像,你能想象出angle=180时的图像是什么样子的吗?

      import turtle as tt

tt.TurtleScreen._RUNNING = True # 启动绘图,在IDE中运行加这句可避免报错

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])#设置不同颜色

        tt.fd(w)

        tt.rt(angle)

        w = w + 2 #

tt.done()


需要本文word版和拓展思考答案的,可以加入“Python算法之旅”知识星球参与讨论和下载文件,Python算法之旅”知识星球汇集了数量众多的同好,更多有趣的话题在这里讨论,更多有用的资料在这里分享。

我们专注Python算法,感兴趣就一起来!

相关优秀文章:

阅读代码和写更好的代码

最有效的学习方式

函数与模块典型例题

字符串专题之中文大写金额数字转换工具

浏览 86
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报