使用蒙特-卡罗方法计算圆周率近似值

蒙特-卡罗方法是一种通过概率来得到问题近似解的方法。假设又一块边长为2的正方形木板,上面画一个单位圆,然后随意往木板上扔飞镖,落点坐标(x,y)必然在木板上(更多的是落在单位圆内),如果扔的次数足够多,那么落在单位圆内的次数除以总次数再乘以4,这个次数会无限接近圆周率的值。

from random import random

times = int(input('请输入掷飞镖次数:'))

hits = 0

for i in range(times):

x = random()

y = random()

if x*x+y*y<=1 :

hits += 1

print(4.0*hits/times)

求素数

1.使用列表实现筛选法

maxNumber = int(input('请输入一个大于2的自然数:'))

lst = list(range(2,maxNumber))

# 最大整数的平方根

m = int(maxNumber**0.5)

for index,value in enumerate(lst):

# 如果当前数字已大于最大整数的平方根,结束判断

if value > m:

break

# 对该位置之后的元素进行过滤

lst[index+1:] = filter(lambda x: x%value != 0,lst[index+1:])

print(lst)

2.使用集合实现筛选法

maxNumber = int(input('请输入一个大于2的自然数:'))

numbers = set(range(2,maxNumber))

# 最大整数的平方根,以及小于该数字的所有素数

m = int(maxNumber**0.5)+1

primesLessThanM = [p for p in range(2,m)

if 0 not in [p%d for d in range(2,int(p**0.5)+1)]]

# 遍历最大整数平方根之内的自然数

for p in primesLessThanM:

for i in range(2,maxNumber//p+1):

# 在集合中删除数字所有的倍数

numbers.discard(i*p)

print(numbers)

小明爬楼梯

假设一段楼梯共15个台阶,小明一步最多能上3个台阶。递推法,递归法。

def climbStairs1(n):

# 递推法

a = 1

b = 2

c = 4

for i in range(n-3):

c,b,a = a+b+c,c,b

return c

def climbStairs2(n):

# 递归法

first3 = {1:1,2:2,3:4}

if n in first3.keys():

return first3[n]

else:

return climbStairs2(n-1) + \

climbStairs2(n-2) + \

climbStairs2(n-3)

print(climbStairs1(15))

print(climbStairs2(15))

蒙蒂霍尔

假设你正参加一个有奖游戏节目,并且有3道门可选:其中一个后面是汽车,另外两个后面是山羊。你选择一个门,比如说1号门,主持人当然知道每个门后面是什么并且打开了一个门,比如说3号门,后面是一只山羊。这时,主持人会问你“你想改选2号门吗?”,然后根据你的选择确定最终要打开的门,并确定你获得山羊(输)或者汽车(赢)。

from random import randrange

def init():

# 返回一个字典,键为3个门号,值为门后的物品

result = {i: 'goat' for i in range(3)}

r = randrange(3)

result[r] = 'car'

return result

def startGame():

# 获取本次游戏中每个门的情况

doors = init()

# 获取玩家选择的门号

while True:

try:

firstDoorNum = int(input('Choose a door to open:'))

assert 0 <=firstDoorNum <= 2

break

except:

print('Door number must be between {} and {}'.format(0,2))

# 主持人查看另外两个门后的物品情况

for door in doors.keys()-{firstDoorNum}:

# 打开其中一个后面为山羊的门

if doors[door] == 'goat':

print('"goat" behind the door', door)

# 获取第三个门号,让玩家纠结

thirdDoor = (doors.keys()-{door,firstDoorNum}).pop()

change = input('Switch to {}?(y/n)'.format(thirdDoor))

finalDoorNum = thirdDoor if change == 'y' else firstDoorNum

if doors[finalDoorNum] == 'goat':

return 'I win!'

else:

return 'You win.'

while True:

print('='*30)

print(startGame())

r = input('Do you want to try once more?(y/n)')

if r == 'n':

break

猜数游戏

程序运行时,系统生成一个随机数,然后提示用户进行猜测,并根据用户输入进行必要的提示(猜对了、太大了、太小了),如果猜对则提前结束程序,如果次数用完仍没有猜对,提前游戏结束并给出正确答案。

from random import randint

def guessNumber(maxValue=10,maxTimes=3):

# 随机生成一个整数

value = randint(1,maxValue)

for i in range(maxTimes):

prompt = 'Start to GUESS:(1-10)' if i==0 else 'Guess again:'

# 使用异常处理结构,防止输入不是数字的情况

try:

x = int(input(prompt))

except:

print('Must input an integer between 1 and ',maxValue)

else:

if x == value:

# 猜对了

print('Congratulations!')

break

elif x > value:

print('Too big')

else:

print('Too little')

else:

# 次数用完还没猜对,游戏结束,提示正确答案

print('Game ouer.FAIL.')

print('The value is ',value)

guessNumber()

抓狐狸游戏

假设一共有一排5个洞口,小狐狸最开始的时候在其中一个洞口,然后玩家随机打开一个洞口,如果里面有狐狸就抓到了。如果洞口里没有狐狸就第二天再来抓,但是第二天狐狸会在玩家来抓之前跳到隔壁洞口里。

from random import choice,randrange

def catchMe(n=5,maxStep=10):

'''模拟抓小狐狸,一共n个洞口,允许抓maxStep次

如果失败,小狐狸就会跳到隔壁洞口'''

# n个洞口,有狐狸为1,没有狐狸为0

positions = [0] * n

# 狐狸的随机位置

oldPos = randrange(0,n)

positions[oldPos] = 1

# 抓maxStep次

while maxStep >= 0:

maxStep -= 1

# 这个循环保证用户输入的是有效洞口编号

while True:

try:

x = input('今天打算打开哪个洞口(0-{0}):'.format(n-1))

# 如果输入的不是数字,就会跳转到except部分

x = int(x)

# 如果输入的洞口有效,结束这个循环,否则就继续输入

assert 0 <= x < n,'要按套路来啊,再给你一次机会。'

break

except:

# 如果输入的不是数字,就执行这里的代码

print('要按套路来啊,再给你一次机会。')

if positions[x] == 1:

print('成功,我抓到小狐狸啦。')

break

else:

print('今天又没抓到。')

# 如果这次没抓到,狐狸就跳到隔壁洞口

if oldPos == n-1:

newPos = oldPos - 1

elif oldPos == 0:

newPos = oldPos + 1

else:

newPos = oldPos + choice((-1,1))

positions[oldPos],positions[newPos] = 0,1

oldPos = newPos

else:

print('放弃吧,你这样乱试是没有希望的。')

# 启动游戏,开始抓狐狸吧

catchMe()

汉诺塔问题

据说古代有一个梵塔,塔内有三个底座A、B、C,A座上有64个盘子,盘子大小不等,大的在下,小的在上。有一个和尚想把这64个盘子从A座移到C座,但每次只能允许移动一个盘子。在移动盘子的过程中可以利用B座,但任何时候3个座上的盘子都必须始终保持大盘在下、小盘在上额顺序。如果只有一个盘子,则不需要利用B座,直接将盘子从A移动到C即可。

def hannoi(num,src,dst,temp=None):

if num < 1:

return

global times # 声明用来记录移动次数的变量为全局变量

# 递归调用函数本身,先把除最后一个盘子之外的所有盘子移动到临时柱子上

hannoi(num-1,src,temp,dst)

# 移动最后一个盘子

print('The {0} Times move:{1}-->{2}'.format(times,src,dst))

towers[dst].append(towers[src].pop())

for tower in 'ABC': # 输出3根柱子上的盘子

print(tower,':',towers[tower])

times += 1

# 把除最后一个盘子之外的其他盘子从临时柱子上移动到目标柱子上

hannoi(num-1,temp,dst,src)

times = 1 # 用来记录移动次数的变量

n = 3 # 盘子的数量

towers = {'A':list(range(n,0,-1)),

'B':[],

'C':[]

}

# A 表示最初放置盘子的柱子,C是目标柱子,B是临时柱子

hannoi(n,'A','C','B')

凯撒加密

输入一个字符串,然后输入一个整数作为凯撒加密算法的密钥,然后输出该字符串加密后的结果。

import string

def kaisa():

s = input('请输入一个字符串:')

k = int(input('请输入一个整数密钥:'))

lower = string.ascii_lowercase

upper = string.ascii_uppercase

before = string.ascii_letters

after = lower[k:] + lower[:k] + upper[k:] + upper[:k]

table = str.maketrans(before,after)

out = s.translate(table)

print(out)

kaisa()

自定义类模拟三维向量及运算

定义一个三维向量类,并定义相应的特殊方法实现两个该类对象之间的加、减运算(要求支持运算符+、-),实现该类对象与标量的乘、除运算(要求支持运算符*、/),以及向量长度的计算(要求使用属性实现)。

class Vector3:

# 构造方法,初始化,定义向量坐标

def __init__(self,x,y,z):

self.__x = x

self.__y = y

self.__z = z

# 与一个向量相加,对应分量相加,返回新向量

def __add__(self, anotherPoint):

x = self.__x + anotherPoint.__x

y = self.__y + anotherPoint.__y

z = self.__z + anotherPoint.__z

return Vector3(x,y,z)

# 减去另一个向量,对应分量相减,返回新向量

def __sub__(self, anotherPoint):

x = self.__x - anotherPoint.__x

y = self.__y - anotherPoint.__y

z = self.__z - anotherPoint.__z

return Vector3(x, y, z)

# 向量与一个数字相乘,各分量乘以同一个数字,返回新向量

def __mul__(self, n):

x, y, z = self.__x*n, self.__y*n, self.__z*n

return Vector3(x,y,z)

# 向量除以一个数字,各分量除以同一个数字,返回新向量

def __truediv__(self, n):

x, y, z = self.__x/n, self.__y/n, self.__z/n

return Vector3(x, y, z)

# 查看向量长度,所有分量平方和的平方根

@property

def length(self):

return (self.__x**2 + self.__y**2 + self.__z**2)

def __str__(self):

return 'Vector3({},{},{})'.format(self.__x,

self.__y,

self.__z)

v1 = Vector3(3, 4, 5)

v2 = Vector3(5, 6, 7)

print(v1+v2)

print(v1-v2)

print(v1*3)

print(v2/2)

print(v1.length)

文本文件操作

编写一个程序demo.py,要求运行该程序后,生成demo_new.py文件,其中内容与demo.py一样,只是在每一行的后面加上行号以#开始,并且所有行的#符号垂直对齐。

filename = 'demo.py'

with open(filename, 'r') as fp:

lines = fp.readlines()

maxLength = len(max(lines, key=len))

lines = [line.rstrip().ljust(maxLength)+'#'+str(index)+'\n'

for index, line in enumerate(lines)]

with open(filename[:-3]+'_new.py', 'w') as fp:

fp.writelines(lines)

磁盘垃圾文件清理器

要求程序运行时,通过命令行参数指定要清理的文件夹,然后删除该文件夹及其子文件夹中所有扩展名为tmp、log、obj、txt以及大小为0的文件。

from os.path import isdir,join,splitext

from os import remove,listdir,chmod,stat

filetypes = ('.tmp','.log','.obj','.txt')

def test2(directory):

if not isdir(directory):

return

for filename in listdir(directory):

temp = join(directory,filename)

if isdir(temp):

test2(temp)

elif splitext(temp)[1] in filetypes or stst(temp).st_size == 0:

chmod (temp,0o777)

remove(temp)

print(temp,'deleted...')

test2(r'D:\test')

python第五章课后答案汉诺塔_python 习题相关推荐

  1. 通信原理樊信昌_通信原理樊信昌第五章课后答案

    通信原理樊信昌第五章课后答案 更多相关问题 下列账簿中,一般采用活页账形式的是() [单选题]<天启宫词>中有一诗句:纤玉剥残双郭索,落花蝶舞唾生香.此句描绘的是吃哪种美食的场景 . 拉卜 ...

  2. 数据结构(C语言)第二版 第五章课后答案

    数据结构(C语言)第二版 第五章课后答案 1~5 A D D C A 6~10 C C B D C 11~15 B C A C A 1.选择题 (1)把一棵树转换为二叉树后,这棵二叉树的形态是(A) ...

  3. python学习-递归(阶乘、汉诺塔)

    文章目录 求阶乘(循环) 求阶乘(递归) 汉诺塔 求阶乘(循环) 如果需要求一个数的阶乘,可能刚开始脑海里面冒出来的是循环计算,下面看看循环如何实现: def recur1(num):rst1 = 1 ...

  4. Python 与神奇的数学之汉诺塔

    您小时候玩过汉诺塔吗?有没有手忙脚乱,晕头转向的赶脚?         汉诺塔(Tower of Hanoi)源于印度的古老传说:大梵天创造世界的时候做了三根金刚石柱子,其中一根柱子自下而上按大小顺序 ...

  5. python汉诺塔_python 汉诺塔

    汉诺塔是由三根杆子A,B,C组成的.A杆上有N个(N>1)穿孔圆盘,盘的尺寸由下到上依次变小.要求按下列规则将所有圆盘移至C杆:每次只能移动一个圆盘:大盘不能叠在小盘上面.提示:可将圆盘临时置于 ...

  6. python汉诺塔运行程序_用python编写一个程序,得到汉诺塔的解决方案

    古代有一座汉诺塔,塔内有3个座A.B.C,A座上有n个盘子,盘子大小不等,大的在下,小的在上,如图所示. 有一个和尚想把这n个盘子从A座移到C座,但每次只能移动一个盘子,并且自移动过程中,3个座上的盘 ...

  7. 递归:这帮小兔子崽子、汉诺塔游戏+习题复习

    ##坑爹的兔子 ##斐波那契数列的迭代实现            ※我们都知道兔子繁殖能力是惊人的,如下图:            ※我们可以用数学函数来定义:            ※课间练习:假设 ...

  8. python第五章课后题答案_python程序设计基础(嵩天)第五章课后习题部分答案

    原博文 2019-10-13 13:50 − 第五章p1515.2:实现isodd()函数,参数为整数,如果参数为奇数,返回true,否则返回false.def isodd(s): x=eval(s) ...

  9. (~最新合集~)计算机网络谢希仁第七版 第五章课后答案

    5-01 试说明运输层在协议栈中的地位和作用,运输层的通信和网络层的通信有什么重要区别?为什么运输层是必不可少的? 答:运输层处于面向通信部分的最高层,同时也是用户功能中的最低层,向它上面的应用层提供 ...

  10. python第五章课后编程题答案_Python核心编程-第五章课后习题

    5-1 整形 讲讲 Python 普通整型和长整型的区别 答:在2.7版本基本淡化了区别.真要区分的话,普通整型是32位或者64位,而长整型只与PC内存有关,很大就是了 5-2 运算符 (a) 写一个 ...

最新文章

  1. ISME:多组学揭示低氧环境下的汞甲基化细菌
  2. 莫烦老师的tensorflow降级方法
  3. 负载均衡集群LVS模式之DR模型
  4. 指令重排与jvm底层实现
  5. c#string倒数第二位插入字符_【转载】C#中string类使用Substring方法截取字符串
  6. Tomcat配置虚拟内存
  7. 支付宝的个人捐赠功能
  8. 特斯拉第四季度生产超30.5万台车 全年交付近百万台
  9. elasticsearch组合查询
  10. 好男人是这样爱老婆的
  11. Boost Asio Examples(整理)
  12. 颜色对照表(四)(16进制、RGB、CMYK、HSV、中英文名)
  13. Spring【三】容器与Bean扩展点
  14. 基础工具组件starter-idempotent-redission设计与实现
  15. nyoj71独木舟上的旅行
  16. C++学习笔记:三种智能指针【Share、Unique、Weak】【Cherno】
  17. 三角函数积分的换元法
  18. python数学基础——单词统计
  19. 关闭计算机防火墙命令,win10系统关闭防火墙命令执行的设置方案
  20. python之数据类型

热门文章

  1. [CVPR2022] A Dual Weighting Label Assignment Scheme for Object Detection
  2. ZIP 压缩解压命令
  3. Linux权限的理解 | 粘滞位 |权限掩码 |文件类型
  4. opendevops_codo项目研究
  5. OutLook 2013 添加 USC gmail 邮箱 解决国内USC邮箱打不开
  6. python 008 __ 小斌文档 | 元组
  7. 11.1.4 子线程与主线程通信实例
  8. 机器学习——神经网络(三):线性神经网络
  9. 程序员学习的5个国外网站推荐
  10. FTP上传和WEB上传的区别