python学习——练习题(6)
"""
题目:斐波那契数列。
程序分析:斐波那契数列(Fibonacci sequence),又称黄金分割数列,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……。
这里所有的斐波那契数列都是以0开头来算
"""
import functools def answer1():
"""
输出100000以内斐波那契数列
:return:
"""
print("\n输出一", end=":")
a = 0
print(a, end=",")
b = 1
print(b, end=",")
c = a + b
while c < 100000:
print(c, end=",")
a = b
b = c
c = a + b answer1() def answer2():
"""
参考答案用到了多变量赋值
:return:
"""
print("\n输出二", end=":")
a, b = 0, 1
print(a, end=",")
while b < 100000:
print(b, end=",")
a, b = b, a + b answer2() def answer3(n, m):
"""
利用递归来实现
:param n:
:return:
"""
if n == 0:
print("\n输出三", end=":")
print(n, end=",")
if m < 100000:
print(m, end=",")
n, m = m, n + m
answer3(n, m)
else:
return answer3(0, 1) def answer4():
"""
利用代数公式计算,公式可参考example006_FormulaDerivation文件:
F(n)=(√5/5)*{[(1+√5)/2]^n - [(1-√5)/2]^n}。
:return:
"""
print("\n输出四", end=":")
i = 0
n = 0
while n < 100000:
print(int(n), end=",")
i += 1
n = (5 ** 0.5 / 5) * (((1 + 5 ** 0.5) / 2) ** i - ((1 - 5 ** 0.5) / 2) ** i) answer4() def answer5(n):
"""
根据输入整数n,获取前n个斐波那契数
:param n:
:return:
"""
print("\n输出五", end=":")
a = 0
print(a, end=",")
b = 1
for i in range(1, n):
print(b, end=",")
a, b = b, a + b answer5(26) def answer6(n):
"""
利用另一种递归来计算,注意与answer3(n, m)区分
其中用到了内嵌函数
:param n:
:return:
"""
print("\n输出六", end=":") def getOne(index):
if index == 1:
return 0
if index == 2:
return 1
num = getOne(index - 2) + getOne(index - 1)
return num for i in range(1, n+1):
print(getOne(i), end=",") answer6(26) def answer7(n):
"""
利用数组来计算
:param n:
:return:
"""
print("\n输出七", end=":")
num = [0, 1]
for i in range(2, n):
num.append(num[-1] + num[-2])
print(num) answer7(26) def answer8(n):
"""
利用公司算前n个
:param n:
:return:
"""
print("输出八", end=":")
for i in range(0, n):
num = (5 ** 0.5 / 5) * (((1 + 5 ** 0.5) / 2) ** i - ((1 - 5 ** 0.5) / 2) ** i)
print(int(num), end=",") answer8(26) def answer9(n):
"""
多变量赋值,获取前n个斐波那契数列
:param n:
:return:
"""
print("\n输出九", end=":")
a, b = 0, 1
while n:
print(a, end=",")
a, b, n = b, a + b, n - 1 answer9(26) @functools.lru_cache(None)
def answer10(n):
"""
在 Python 的 3.2 版本中,引入了一个非常优雅的缓存机器,即 functool 模块中的 lru_cache 装饰器。如果要在 python2 中使用 lru_cahce 需要安装 functools32。lru_cache 原型如下: @functools.lru_cache(maxsize=None, typed=False) 使用functools模块的lur_cache装饰器,可以缓存最多 maxsize 个此函数的调用结果,从而提高程序执行的效率,特别适合于耗时的函数。参数maxsize为最多缓存的次数,如果为None,则无限制,设置为2n时,性能最佳;如果 typed=True(注意,在 functools32 中没有此参数),则不同参数类型的调用将分别缓存,例如 f(3) 和 f(3.0)。 被 lru_cache 装饰的函数会有 cache_clear 和 cache_info 两个方法,分别用于清除缓存和查看缓存信息。 这里用一个简单的示例演示 lru_cache 效果:
from functools import lru_cache
@lru_cache(None)
def add(x, y):
print("calculating: %s + %s" % (x, y))
return x + y print(add(1, 2))
print(add(1, 2))
print(add(2, 3))
输出结果: calculating: 1 + 2
3
3
calculating: 2 + 3
5
从结果可以看出,当第二次调用 add(1, 2) 时,并没有真正执行函数体,而是直接返回缓存的结果。 有一个用 C 实现的,更快的,同时兼容 Python2 和 Python3 的第三方模块 fastcache 能够实现同样的功能。
:param n:
:return:
"""
if n == 1:
print("\n输出十", end=":")
assert n >= 1
m = 0 if n == 1 else answer10(1)+1 if n == 2 else answer10(n - 2) + answer10(n - 1)
print(m, end=",")
return m answer10(26) def answer11(n):
"""
reduce练习
:return:
"""
print("\n输出十一", end=":")
num = [0, 1]
for i in range(2, n):
num.append(functools.reduce(lambda x, y: x + y, num[-1: -3: -1]))
print(num) answer11(26) def answer12(n):
"""
练习sum 和列表切片
:param n:
:return:
"""
print("输出十二", end=":")
num = [0, 1]
for i in range(2, n):
num.append(sum(num[i-2: i]))
print(num) answer12(26) class Fibs:
"""
练习类,创建一个迭代器
"""
def __init__(self, n):
self.a = 0
self.b = 1
self.n = n
self.i = 1
print("输出十三", end=":") def __iter__(self):
return self def __next__(self):
if self.i > self.n:
raise StopIteration
print(self.a, end=",")
self.a, self.b = self.b, self.a + self.b
self.i += 1 f = Fibs(26)
for i in f:
pass
python学习——练习题(6)的更多相关文章
- python学习——练习题(10)
""" 题目:暂停一秒输出,并格式化当前时间. """ import sys import time def answer1(): &quo ...
- python学习——练习题(9)
""" 题目:暂停一秒输出. 程序分析:使用 time 模块的 sleep() 函数. http://www.runoob.com/python/python-date- ...
- python学习——练习题(4)
""" 题目:输入某年某月某日,判断这一天是这一年的第几天? """ import datetime import time from fu ...
- python学习——练习题(1)
""" 题目:有四个数字:1.2.3.4,能组成多少个互不相同且无重复数字的三位数?各是多少? """ import itertools d ...
- python学习——练习题(13)
""" 题目:打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身.例如:153是一个" ...
- python学习——练习题(12)
""" 题目:判断101-200之间有多少个素数,并输出所有素数. 质数(prime number)又称素数,有无限个. 质数定义为在大于1的自然数中,除了1和它本身以外 ...
- python学习——练习题(11)
""" 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 1 1 2 ...
- python学习——练习题(8)
""" 题目:输出 9*9 乘法口诀表. """ def answer1(): """ 自己用最普通的双重循环 ...
- python学习——练习题(7)
""" 题目:将一个列表的数据复制到另一个列表中. """ import copy def validate(a, b): "&q ...
随机推荐
- 使用SDWebImage加载大量图片后造成内存泄露的解决办法
SDWebImage的知名度就不用说了,github上近10k的star,国内外太多的App使用其进行图片加载. 但是最近在使用过程中发现,在UITableView中不断加载更多的内容,使用SDWeb ...
- 深度优先搜索入门:POJ1164城堡问题(递归、用栈模拟递归)
将问题的各状态之间的转移关系描述为一个图,则深度优先搜索遍历整个图的框架为:Dfs(v) {if( v 访问过)return;将v标记为访问过;对和v相邻的每个点u: Dfs(u);}int main ...
- Luogu 3806 点分治1
Luogu 3806 点分治 要分清楚各个函数的作用及互相调用的关系. 因为是无根树,找重心的时候,父亲一边的所有节点也可以看做是一颗子树. #include<bits/stdc++.h> ...
- APP开发浅谈-Fiddler抓包详解
Fiddler抓包工具在APP开发过程中使用非常频繁,对开发者理解HTTP网络传输原理以及分析定位网络方面的问题非常有帮助.今天抽点时间出来总结一下Fiddler在实际开发过程中的应用. 我开发过程中 ...
- anycast简单总结
一针见血,言简意赅的总结 bgp+anycast就是不同服务器用了相同的ip地址 anycast 技术特点 bgp+anycast就是多个主机使用相同ip地址的一种技术,当报文发给该地址时,根据路由协 ...
- Spring Cloud feign 服务超时处理
Spring Cloud中,Feign和Ribbon在整合了Hystrix后,可能会出现首次调用失败的问题 造成该问题的原因 Hystrix默认的超时时间是1秒,如果超过这个时间尚未响应,将会进入fa ...
- springboot中 简单的SpringMvc全局异常处理
1.全局异常处理类:GlobalExceptionHandler.java package com.lf.exception; import java.util.HashMap; import jav ...
- FastAdmin 中 Bootstrap-Table 列宽控制
FastAdmin 中 Bootstrap-Table 列宽控制 使用 css 控制 1 使用 formatter 处理 2 http://issues.wenzhixin.net.cn/bootst ...
- 关于如何利用Pocket CHM Pro制作帮助文档
关于如何利用Pocket CHM Pro制作帮助文档 编写人:CC阿爸 2015-4-6 今天在这里,我想与大家一起分享如何利用Pocket CHM Pro制作软件系统的帮助文档,在此做个小结,以供参 ...
- JAVA-Unit03: SQL(基础查询) 、 SQL(关联查询)
Unit03: SQL(基础查询) . SQL(关联查询) 列别名 当SELECT子句中查询的列是一个函数 或者表达式时,那么查询出来的结果集 中对应的该字段的名字就是这个函数或者 表达式的名字.为此 ...