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 ...
随机推荐
- 使用FastReport.net 报表在网页上实现打印功能
这些年的工作当中,最早是在8年前接触到FastReport这个报表工具,从名字上来看,直译过来就是快速报表,正所谓天下武功,唯快不破,FastReport报表早些年确实是制作报表的不二之选,8年前的工 ...
- PyCharm字体大小调整
1.点击左上角File----settings----keymap----------搜索increase,选中,increase font size--------再选择enter mouse sh ...
- 最火的分布式 HTAP 数据库 TiDB - 入门实践教程
偶然在某篇博客看到了 TiDB,一个融合 OLTP 和 OLAP 的分布式开源数据库, GitHub 上 Star 很多,然后 watch 了,发现 commit 和 pull request 一直都 ...
- C#实现Hash应用全解
1.引言 HASH是根据文件内容的数据通过逻辑运算得到的数值, 不同的文件(即使是相同的文件名)得到的HASH值是不同的. 通过一定的哈希算法(典型的有MD5,SHA-1等),将一段较长的数据映射为较 ...
- abp(net core)+easyui+efcore实现仓储管理系统——使用 WEBAPI实现CURD (十二)
abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统——ABP总体介绍(一) abp(net core)+ ...
- js学习之数据类型
js学习之数据类型 基础类型:number string boolean null undefined 引用类型:object array function undefined值是派生自null值的( ...
- JVM解剖乐园
1.JVM锁粗化和循环原文标题:JVM Anatomy Quark #1: Lock Coarsening and Loops 众所周知Hotsport编译器会进行JVM锁粗化和优化,它将相邻的锁区块 ...
- scrapy 自学入门demo分享
[toc] 本文基于python 3.7.0,win10平台: 2018-08 完整项目代码:https://github.com/NameHewei/python-scrapy 安装 安装pytho ...
- windwos环境下安装python2和python3
一 python安装 下载地址: https://www.python.org/downloads/ 环境变量:Path中添加C:\Python27\Scripts\;C:\Python27\; C: ...
- 从零开始学习GDI+ (一)
前言: GDI+从Windows XP操作系统(大概2002-2003年)开始引入的,现在都9102年了,再学习这么古老的技术肯定是过时了.windows桌面程序没落了,随着移动的兴起,用户被惯坏了, ...