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

  

时间: 2024-10-11 20:33:35

python学习——练习题(6)的相关文章

python学习——练习题(1)

""" 题目:有四个数字:1.2.3.4,能组成多少个互不相同且无重复数字的三位数?各是多少? """ import itertools def answer1(): """自己思考完成,一开始以为两个循环就可以搞定了,结果还是要用三个循环:打印时只要效果在就好了,不用专门用int去组合成三位数字了""" print("答案一", end=":")

python学习--练习题6、7、8--九九乘法表,前两项相加问题,素数输出问题

练习6 #输出9*9乘法表 s=(i*n for i in range(1,10) for n in range(1,10)) print(list(s)) 练习7 #题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 一共经历了几个月=int(input("几月:")) def 多少只兔子(): s=[1,1] for i in range(0,一共经历了几个月+1): t=s[i+1]

python学习-练习题兔子生长问题巩固

有一对兔子,一个月之后成熟,成熟之后每个月会生出一对兔子,理想状态下兔子不会死,请问n个月后有多少兔子? 分析:第一个月:1 第二个月:1 第三个月:2 第四个月:3 第五个月:5 第六个月:8 从前面几个月看,从第三个月开始,后面每个月的兔子数量等于前面两个月兔子的总和 month = int(input('请输入月份:')) def rabbit(month): for i in range(1,month+1): if i == 1 or i ==: return 1 if i >2: r

python学习-练习题1巩固

1.生成随机数 random.random()生成一个0-1之前的随机数 random.uniform(1,10)生成一个区间范围内的随机数 random.randint(3,9)生成一个区间范围内的整数随机数 random.choice(list or str or tunple)在列表.元组.字符串等序列中随机选取一个元素 random.shuffle(a)随机打乱一个序列 random.sample(a)从序列中随机获取指定长度的片段 2.生成uuid uuid.uuid1()基于时间戳

python学习-练习题4巩固

一个数加100后是一个整数的平方,加268后也是一个数的平方,求这个数 分析:这个数加100之后开方是整数,说明int(math.sqrt(a+100))转为整数应该没有小数部分 so:b*b = int(math.sqrt(a+100)) 代码如下: import math for i in range(100000): a = int(math.sqrt(i+100)) b = int(math.sqrt(i+268)) if (a*a == i + 100) and (b*b == i +

python学习——练习题(2)

""" 题目:企业发放的奖金根据利润提成.利润(I)低于或等于10万元时,奖金可提10%: 利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可提成7.5%: 20万到40万之间时,高于20万元的部分,可提成5%:40万到60万之间时高于40万元的部分,可提成3%: 60万到100万之间时,高于60万元的部分,可提成1.5%,高于100万元时,超过100万元的部分按1%提成, 从键盘输入当月利润I,求应发放奖金总数? ""

python学习——练习题(7)

""" 题目:将一个列表的数据复制到另一个列表中. """ import copy def validate(a, b): """ 验证复制结果 :param a: :param b: :return: """ print("a =", a) print("b =", b) print("a == b is", a == b)

python学习——练习题(8)

""" 题目:输出 9*9 乘法口诀表. """ def answer1(): """ 自己用最普通的双重循环来输出 :return: """ print("输出一:") for i in range(1, 10): for j in range(1, i + 1): print("%d x %d =%2s" % (i, j, i * j), en

python学习——练习题(13)

""" 题目:打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身.例如:153是一个"水仙花数", 因为153=1的三次方+5的三次方+3的三次方. 程序分析:利用for循环控制100-999个数,每个数分解出个位,十位,百位. """ def answer1(): """ 正常for循环比较 :return: "