Python实现的一些常见简单问题(持续更新)
提纲:
1.汉诺塔
2.找到某个范围内的所有质数
3.杨辉三角
4.用闭包实现一个计数器,调用一次计数器加1
5.将类构造成可迭代对象,实现斐波那契数列
......
1.汉诺塔(汉诺塔)
用递归函数实现汉诺塔(A、B、C柱,要将圆盘从A柱移到C柱,且排列顺序不变)
思想:不管A柱有多少个圆盘(假设n个),我们可以将看成将上面的(n-1)个圆盘看成一个整体,那么问题就变得非常简单:
1)将上面的(n-1)个圆盘实现从A柱全部移动到B柱
2)把最后一个圆盘从A柱移到C柱
3)将刚刚移到B柱的(n-1)个圆盘从B柱全部移动到C柱。
这就是整个的过程,那么我们可以看到,上述1)和3)其实也是一次汉诺塔的完整过程,只不过是圆盘数目不同。因此,这里利用递归函数就能快速简单地解决问题。
代码如下;
def move(n,a,b,c):
'''
n:圆盘数
a,b,c分别代表三个柱子
'''
if n == 1:
print(a, '-->', c)
else:
move(n-1,a,c,b)
print(a, '-->', c)
move(n-1,b,a,c) if __name__ == '__main__':
move(3,'A','B','C')
# 输出:
# A --> C
# A --> B
# C --> B
# A --> C
# B --> A
# B --> C
# A --> C
2.找到某个范围内的所有质数(质数)
有的语言中实现质数需要用到循环,对于每一个数去判断是不是质数。然而,质数是一个无限的序列,当判断的范围非常大的时候,程序运行占用内存较大。在Python中生成器可以按照某种计算规则推算出列表的后续元素不需要建立一个完整的列表,是一种一边循环一边计算的机制能节省内存。
用生成器找到某个范围内的所有质数:
#构造一个从3开始的奇数序列:
def _odd_iter():
n = 1
while True:
n = n + 2
yield n #筛选函数,返回的是True/False,这里x是从it中依次取所有元素
def _not_divisible(n):
return lambda x: x % n > 0 #定义一个生成器,不断返回下一个素数
def primes():
yield 2
it = _odd_iter()#初始序列
while True:
n = next(it)
yield n
it = list(filter(_not_divisible, it))#把it中不满足要求的元素filter掉,注意_not_divisible函数会将it中的每一个元素作为参数进行判断 #因为primes也是生成器,即一个无限序列,因此调用时要设置一个退出循环的条件
# 打印100以内的素数:
for n in primes():
if n < 100:
print(n)
else:
break
3.杨辉三角(杨辉三角)
#用生成器实现输出杨辉三角 def triangles():
lis = [1]
i = 0
while i < 10:
yield lis
lis = iter(lis)
i += 1 def iter(list):
# 上一次迭代的list
i = 1
next_list = [1]
while i < len(list):
next_list.append(list[i-1] + list[i])
i += 1
next_list.append(1)
return next_list n = 0
results = []
for t in triangles():
print(t)
results.append(t)
n = n + 1
if n == 10:
break
if results == [
[1],
[1, 1],
[1, 2, 1],
[1, 3, 3, 1],
[1, 4, 6, 4, 1],
[1, 5, 10, 10, 5, 1],
[1, 6, 15, 20, 15, 6, 1],
[1, 7, 21, 35, 35, 21, 7, 1],
[1, 8, 28, 56, 70, 56, 28, 8, 1],
[1, 9, 36, 84, 126, 126, 84, 36, 9, 1]
]:
print('测试通过!')
else:
print('测试失败!')
4.用闭包实现一个计数器,调用一次计数器加1
#用闭包实现一个计数器,调用一次计数器加1 def counter():
cnt = 1
def c():
nonlocal cnt
x = cnt
cnt += 1
return x
return c counter1 = counter()
print(counter1())#
print(counter1())#
print(counter1())#
print(counter1())#
print(counter1())#
5.将类构造成可迭代对象,实现斐波那契数列
#迭代器协议:对象必须提供__next__方法
#用__iter__来实现迭代器协议的对象
#要使一个类成为可迭代对象,就要定义这两个方法
class Fib:
def __init__(self):
self._a = 1#起始的两个值
self._b = 1 def __iter__(self):
return self def __next__(self):
self._a, self._b = self._b, self._a + self._b
return self._a
f=Fib()
print(next(f))#
print(next(f))#
print(next(f))#
print(next(f))#
print(next(f))#
# print('==================================')
# for i in f:
# print(i)#这里会从8之后的13开始迭代,因此迭代器只能遍历一次
Python实现的一些常见简单问题(持续更新)的更多相关文章
- python爬虫的一个常见简单js反爬
python爬虫的一个常见简单js反爬 我们在写爬虫是遇到最多的应该就是js反爬了,今天分享一个比较常见的js反爬,这个我已经在多个网站上见到过了. 我把js反爬分为参数由js加密生成和js生成coo ...
- Python语言上机题实现方法(持续更新...)
Python语言上机题实现方法(持续更新...) 1.[字符串循环左移]给定一个字符串S,要求把S的前k个字符移动到S的尾部,如把字符串"abcdef"前面的2个字符'a'.'b' ...
- Python常用组件、命令大总结(持续更新)
Python开发常用组件.命令(干货) 持续更新中-关注公众号"轻松学编程"了解更多. 1.生成6位数字随机验证码 import random import string def ...
- Android源码编译常见错误(持续更新)
本文为个人工作中处理遇到的编译问题做个小结,后续遇到新的问题,持续更新. No such file or directory: 1. 检查路径是否有问题,文件是否存在,若文件存在且路径没问题 2. 检 ...
- [Python] Python学习笔记之常用模块总结[持续更新...]
作为一种极其简单的编程语言,Python目前成为了最炙手可热的几种语言之一.它不仅简单易学,而且它还为用户提供了各种各样的模块,功能强大,无所不能.有利必有弊,学习Python同样有困扰,其中之一就是 ...
- pycharm编辑器简单配置-- 持续更新完善
目录 python解释器安装.多版本共存等 给pycharm编辑器选择python解释器版本 配置pip仓库地址 方式一:直接修改文件配置 方式二:pycharm配置 方式三:通过临时指定pip仓库地 ...
- javascript/jquery 常见功能实现(持续更新...)
1. input 只能输入整数数字和字母 $(document).on('keyup','#no',function(){ var val = $.trim($(this).val()); if(va ...
- Python全栈学习_作业集锦(持续更新)
python基础 day1 python初识 . 计算机基础(cpu,内存,硬盘,操作系统) . Python出生于应用 . python发展史 . 编程语言分类 . python优缺点 . pyth ...
- hadoop常见算法(持续更新)
1. 对以下数据进行排序,根据收入减去支出得到最后结余从大到小排序 账号 收入 支出 日期 zhangsan@163.com 6000 0 2014-02-20 lisi@163.com 2000 0 ...
随机推荐
- AQS原理浅析
锁是最常用的同步方法之一,在高并发的环境下激烈的锁竞争会导致程序的性能下降,所以我们自然有必要深入的学习一下锁的相关知识. java的内置锁一直都是备受争议的,在JDK 1.6之前,synchroni ...
- jProfiler远程连接Linux监控jvm、tomcat运行状态
第一步.下载软件 官网地址:https://www.ej-technologies.com/download/jprofiler/files , Mac客户端 GUI界面 Linux服务端 第二步.安 ...
- UPC Contest RankList – 2019年第二阶段我要变强个人训练赛第十四场
A.JOIOJI •传送门 [1]:BZOJ [2]:洛谷 •思路 在一个区间(L,R]内,JOI的个数是相等的,也就是R[J]-L[J]=R[O]-L[O]=R[I]-L[I], 利用前缀和的思想, ...
- web前端开发-博客目录
web前端开发是一个新的领域,知识连接范围广,处于设计与后端数据交互的桥梁,并且现在很多web前端相关语言标准,框架库都在高速发展.在学习过程中也常常处于烦躁与迷茫,有时候一直在想如何能够使自己更加系 ...
- string的学习
原:https://blog.csdn.net/qq_37941471/article/details/82107077 一. string的构造函数的形式: string str:生成空字符串 st ...
- CentOS 配置阿里云 NTP 服务
NTP 是网络时间协议(Network Time Protocol),NTP 服务能保证服务器的本地时间与标准时间同步. ▶ 配置时区信息 1.删除系统里的当地时间链接 sudo rm /etc/lo ...
- 关于JS、JQ首行首列固定展示
当时遇见这个问题 是医院手麻系统大批量数据展示,由于是旧项目系统没有使用到前端的架构 只能使用JQ,JS, css完成 也谢谢给予我支持的同行们 固定首行数据: 采用函数的方式进行 JQ /** * ...
- unity3d立方体碰撞检测(c#代码实现)
由于unity自带的碰撞组件特别耗费性能,网上的unity物体碰撞的c#代码实现比较少,没有适合的,只能自己写一个来用: using System; using System.Collections. ...
- Vue项目的创建和UI资源
Vue项目创建打包与UI资源 1.Vue项目创建 1.1 vue-cli脚手架 vue-cli是一个基于vue的构建工具,用于搭建vue项目的环境,有着兼容,方便,快速的优点,能够完全遵循前后端分离的 ...
- 后端开发实践系列之二——领域驱动设计(DDD)编码实践
Martin Fowler在<企业应用架构模式>一书中写道: I found this(business logic) a curious term because there are f ...