Python程序设计实践 教案 实验20 趣味逻辑推理_第1页
Python程序设计实践 教案 实验20 趣味逻辑推理_第2页
Python程序设计实践 教案 实验20 趣味逻辑推理_第3页
Python程序设计实践 教案 实验20 趣味逻辑推理_第4页
Python程序设计实践 教案 实验20 趣味逻辑推理_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

«Python程序设计实践教程》课程教案

课题:趣味逻辑推理

教学目的:

1.逻辑思维题是一种很好的训练逻辑思维的方式,会用到一些典型的算法。

2.本实验选取了几个趣味逻辑推理、统计的编程实例。

课型:新授课

课时:

本章安排2个课时。

教学重点:

重点:通过趣味逻辑推理、统计的编程实例训练逻辑思维的方式。

教学难点:

难点:教学难点在于引导学生准确梳理猴子吃桃、鸡兔同笼、幼儿园分糖果问题中的

复杂逻辑关系,通过合理假设与严谨推理,构建数学模型并运用恰当算法求解,克服思维

定式与逻辑陷阱。

教学过程:

1.教学形式:讲授课,教学组织采用课堂整体讲授和分组演示。

2.教学媒体:采用启发式教学、案例教学等教学方法。教学手段采用多媒体课件、视

频等媒体技术。

板书设计:

本课标题趣味逻辑推理课次0.5

课时安排2

授课方式理论课口讨论课口习题课口其他口

学分共2分

授课对象普通高等院校学生任课教师

教材及参考资1.《Python程序设计实践教程》。

料2本.教材配套视频教程及学习检杳等资源v

3.与本课程相关的其他资源。

教学基本内容教学方法及教学手段

课程引入参考以下形式:

生活里不少看似平常的场景,实则蕴含着精妙的逻辑推1.衔接导入

理。就说周末去逛动物园,看到鸡和兔子同处一笼,只数得脑2悬.念导入

袋与脚的数量,如何算出鸡鱼各几何?这便是经典的“鸡免同3情.景导入

笼”问题。再想象一个画面,幼儿园老师给小朋友分糖果,每4激.疑导入

个小朋友分的数量不同,要保证公平乂刚好分完,老师得经过5演.示导入

怎样的思考与计算?这背后也藏着逻辑推理的智慧。还有个有6实.例导入

趣的事儿,一只猴子每天吃桃子,吃法有独特规律,我们怎样7其.他形式

通过它最后的桃子剩余数量,反推出最初有多少桃子呢?这就

是“猴子吃桃问题”。接下来,就让我们走进这些趣味逻辑推

理问题,锻炼思维,探寻其中的奥秘。

实验20趣味逻辑推理1.教学以学生学习教材的

实例20T獗子吃桃问题基本内容为主,系统全面地

1.题目描述了解趣味逻辑推理。

有一只猴子第一天摘下若干个桃子,当即吃掉了一半,又多吃2.整个教学过程中,各教学

了一个;第二天将剩下的桃子吃掉一半,又多吃一个。按照这点可根据实际情况,进行拓

样的吃法,每天都吃前一天剩下的桃子的一半又一个。到了第展知识的讲解。

十天,只剩下一个桃子。请问这只猴子第一天摘了多少个桃

子?

2.题目分析

本题是一个递推问题,计算时可以从最后一天回推到第一天。

前一天的桃子是后一天的桃子的数量加1的2倍。

3.程序代码

(1)用while语句

x0=l

day=10

whileday>l:

day-=l

xl=2*(x0+1)

xO=xl

print(xO)

(2)用for循环

x2=1

fordayinrange(9,0,-1):

xl=(x2+1)*2

x2=xl

print(xl)

4.运行结果

1534

5.思考与讨论

(1)天数未知的情况

猴子第一天摘下若干个桃子,当即吃掉一半,又多吃一个。第

二天早上又将剩下的桃子吃了一半,又多吃一个。每天都吃前

一天剩下的桃子的一半又一个。到了第〃天早上,猴子发现只

剩下一个桃子了。问第一天猴子共摘了多少个桃子?

要求在第一行中输入天数(整数),在下一行中输出总共的桃

子数。

用递归算法编写的程序如下。

defpeach(day):

ifday==1:

return1

return(peach(day-1)+1)*2

n=int(input(”请输入天数:"))

print("总共有%d只桃子"%p,ach(n))

输入样例如下。

请输入天数:3

输出样例如下。

总共有10只桃子

(2)剩余桃子数未知的情况

猴子第一天摘下若干个桃子,当即吃了2/3,还不过瘾,又多

吃了一个;第二天早上将剩下的桃子吃掉2/3,又多吃了一个。

以后每天早上都吃前一天剩下的2/3再多一个。到了第〃天早

上,发现只剩下〃个桃子。问第一天共摘了多少个桃子?

首先输入•个正整数Z表示测试数据的组数,然后输入f组测

试数据。每组数据输入2个正整数〃、k(#<15)o

输入样例如下。

2

21

42

输出样例如下。

6

93

6.问题拓展

五人分鱼问题

某天夜里,A、B、C、D、E王个人一起去捕鱼,到了第二天凌

晨都疲惫不堪,于是各自找地方睡觉。A第一个醒来,他将鱼

分为五份,把多余的一条鱼扔掉,拿走了自己的一份。B第二

个醒来,也将鱼分为五份,把多余的一条鱼扔掉,拿走了自己

的一份。C、D、E依次醒来,也按同样的方法拿鱼。问他们至

少捕了多少条鱼?

根据题意可知,总计将所有鱼进行了5次平均分配,每次分配

的策略是相同的,即扔掉一条鱼后剩下的鱼正好分为5份,然

后拿走自己的一份,剩下其他4份。假定鱼的总数为〃,则/y

1可被5整除,余下的鱼为4(疗1)/5。若〃满足上述要求,则

〃就是题目的解。

请分析以下程序。

defyu(n):

a=l

b=a

while1:

foriinrange(n-l):

a=(a-l)/n*(n-1)

if(a-l)%n==0:

returnb

b+=l

a=b

print(yu(5))

输出结果如下。

3121

实例20-2鸡兔同笼

1.题目描述

笼子里共有a个头、力只脚,问有儿只鸡、几只兔?

要求在第一行中输入鸡和兔的总数,在第二行中输入鸡和兔的

脚数,输出鸡和兔的个数或无结果。

2.题目分析

鸡兔同笼是中国古代的数学名题之一。大约在1500年前,《孙

子算经》就记载了这个有趣的问题,书中是这样叙述的:“今

有雉兔同笼,上有三十五头,下有九十四足,问雉兔各几何?”

这一问题的本质是二元方程。假设共有鸡、兔30只,脚90只。

变量x表示鸡的只数,y表示兔子的只数,>、y都不能为小数,

且产片30、2户4.尸90,得到x的定义域为[0,30],y的定义域

为[0,23)。

3.算法设计

①方法1:利用双重循环实现。

forjiinrange(0,31):

fortuinrange(0,23):

ifji+tu==30and2*ji+4*tu==90:

print(1鸡:',ji,'兔:',tu)

注意:采用双重循环,循环体执行了31X23=713次。

②方法2:利用一重循环实现。

forjiinrange(0,31):

if2*ji+(30-ji)*4=90:

print('鸡:兔:',30-ji)

注意:采用一重循环,循环体执行了31次。

③方法3:解方程组。

根据题意,列出以下方程组。

户尸a

2户4y=Z)

解得

片(456)/2

y={b-2a)/2

其中年30、岳90,代码如下:)

a=30

b=90

x=(4*a-b)/2

y=(b-2*a)/2

print('鸡:’,x,‘兔:',y)

4.程序代码

#s120-2.py

a=ini(input("请输入鸡和兔的总数:\n"))

b=int(input("请输入鸡和兔的脚数:\n"))

flag=True

forjiinrange(0,a+1):

fortuinrange(0,b//4+l):

ifji+tu==aand2*ji+4*tu==b:

print(f”鸡有{ji}只,兔有{tu}只")

flag=False

ifflag:

print(r{a}只动物{b}只脚的情况无解”)

5.运行结果

如果有解,则输入和输出样例如下。

请输入鸡和兔的总数:

24

请输入鸡和兔的脚数:

70

鸡有13只,兔有11只

如果无解,则输入和输出样例如下。

请输入鸡和兔的总数:

10

请输入鸡和兔的脚数:

27

10只动物27只脚的情况无解

6.问题拓展

一个笼子里面关了若干只鸭子和狗(鸭子有2只脚,狗有4只

脚,没有例外),己知脚的总数为feets,则笼子里至少有多

少只动物,至多有多少只动物?

在第一行中输入一个正整数,表示测试数据的组数不在接下

来的〃行中,每行输入一个整数,代表脚的数量。

输出〃行数据,每行包含两个正整数,第一个是最少的动物数,

第二个是最多的动物数,两个正整数间用一个空格分隔。

输入样例如下。

2

3

20

输出样例如下。

00

510

实例20-3幼儿园分糖果

1.题目描述

六一儿童:节来临了,幼儿园准备给小朋友们分发糖果。现有几

箱不同的糖果,每箱糖果都有自己的价值和卡量。每箱糖果都

可以拆分成任意散装组合带走。老师给各位小朋友准备了一个

只能装下一定重量糖果的包包。请问小朋友最多能带走多少价

值的糖果?

要求第一行的输入数据由两部分组成,分别为糖果箱数〃(正

整数,1W/7W100)以及小朋友的包包能装下的最大重量犷(正

整数,0<«<10000);其余〃行每行对应一箱糖果,由正整数r

和“•组成,分别为一箱糖果的价值和重量。

要求输出小朋友能带走的糖果的最大总价值,保留一位小数。

2.题目分析

采用贪心算法,在重量允许的范围内,尽可能多装价值大的糖

果。

首先计算出每种糖果单位重量的价值。取糖果时,从单位价值

较大的糖果开始,进行累加,直到达到最大重量。

3.算法设计

设置两个列表,列表1存储所有糖果的单位价值,在列表2中

添加一个新列表,该列表存放总重量、单位价值、该糖果是否

已被取走。

首先对单位价值最大的糖果进行分配,所以要对存储单位价值

的列表进行降序排列,然后遍历列表2中单位价值最大的糖

果。先全部取出该糖果,判断此时取出的重量是否超过包包的

重量,若超过,就通过循环依次减少一单位重量。当取走的重

量等于最大承重量时,计算价值较大的一件物品应取走的数

量,重复该过程直至等于最大承重量。

4.程序代码

#s120-3.py

inputa,inputb=input().split()

list_a=[]

list_b=[]

foriinranged,int(inptt_a)+l):

input_c,inpuc_d=input().splitO

ave=round(int(input_c)/int(inputd),1)#

单位价值

lista.append(ave)

list_b.append([int(irput_d),ave,0])#

在列表2中添加一个新列表,该列表存放总重量、单位价值、

是否该糖果已被取走

1ist_a.sort(reverse=True)#降序

排列

sum=[0,0]#用于存放取走

的总重量

num=0

prime=0#判断

foriinrange(len(list_6)):

forkinrange(len(listb)):

ifprime==0:#做是

否超出最大承重量的标记,未超出为0

if(list_a[i]==

list_b[k][l])and(list_b[k][2]==0):

sum[l]=sum[0]#备份

sum[0]=sum[0]+list_b[k][0]#取走

的重量

val=list_b[k][0]

ifsum[0|>int(inputb):#

如果所有取走的重量超出包包的最大承重鬲,就依次减少一单

位重量

prime=l

t=list_b[k][0]

whileTrue:

2=sum[l]+t

ifz<=int(input_b):

break

t=t-1

val=t#等于最大

承重量时,价值较大的一件物品应取走的数量

sum[G]=sum[l]#重新赋原

sum[G]=sum[0]+t#此时

为真正的取走数量

num=list_a[i]*val+num#总价

list_h[k][2]=1力取走

的标记

print(num)

5.运行结果

输入样例如下。

415

1004

4128

2667

5912

输出样例如下。

11940

6.思考与讨论

①请证明本题所使用的贪心算法的正确性。

②假设规定只能拿整箱糖果,那么贪心算法还正确吗?还能

获得最优解吗?

7.问题拓展

假设有〃种物品(每种仅有一个)和一个承重量为“,的背包,

假定第1•种物品的重量为电,价值为匕。要求选择物品装入背

包,使装入背包中的物品的息价值最大。

分3行输入数据,第1行为整数〃(1W/W400)和

1500),分别表示物品数量与背包承重量;第二行为〃个物品

的重量%(1W/W/7);第三行为〃个物品的价值匕(1WiW

加。物品的重量、价值都为整数。

输出一个整数,表示装入背包的最大总价值。

输入样例如下。

49

2345

3457

25100

42648133812481741254126474117125730

3571732452738

49195340224362049256148673457

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论