码迷,mamicode.com
首页 > 其他好文 > 详细

求斐波那契数列和素数

时间:2020-09-12 21:55:18      阅读:93      评论:0      收藏:0      [点我收藏+]

标签:bre   个数   版本   方案   观察   pen   数据   循环   斐波那契数   

所谓斐波那契数列指的是数列:1,1,2,3,5,8,13,21,……。用语言描述就是后一项等于前两项和。

打印100以类的斐波那契数列

a = 1
b = 1
print(a)
print(b)
while True:
    c = a + b
    if c > 100:
        break
    a = b
    b = c
    print(c) 

要点:

  1. 起始两项特殊处理
  2. 计算c后,a的值指向b,b的值指向c,交换后再循环

求斐波那契数列的101项

假设是从第0项开始,到第100项结束,共101项,那第0项和第1项都为1

a = 1
b = 1
c = 0  # 给变量c一个初始值,最后要打印第101项
for i in range(101):
    if i > 1:  # 0和1时不用计算
        c = a + b
        a = b
        b = c
print(c)
# 573147844013817084101

使用递归实现斐波那契数列

在python中应该尽量避免使用递归,递归有层数限制,各个python版本限制各异。

def fib(n):
    if n < 2:
        return 1
    else:
        return fib(n-1) + fib(n-2)

for i in range(10):
    print(fib(i)) 
# 输出
1
1
2
3
5
8
13
21
34
55

上边的代码随着n增大,嵌套层数就越来越大,对计算机的内存消耗会快速增大,代价相当 大。实际项目中不会这么用。

改进方案

def fib(n, pre=0, cur=1):
    pre, cur = cur, pre + cur
    print(cur, end=‘ ‘)
    if n == 2:
        return
    fib(n-1, pre, cur)

fib(10)
# 输出
1 2 3 5 8 13 21 34 55

此种方案把每次计算的结果以实参的形式传递给函数,这样效率很高。

求100内的所有素数

如果一个整数只能被1和自身整除,那这个数就为素数。大于2的偶数一定不为素数

n = 101
count = 0
for i in range(1, n, 2):  # 跳过偶数,但要记得2是素数
    for j in range(2, i):  # 在[2,i)范围内若能整除就说明该数不是素数
        if i % j == 0:
            break
    else:
        count += 1
        if i == 1:
            print(i)
            print(2)
        else:
            print(i)
print(‘count: {}‘.format(count + 1))  # count要加1是因为2这个素数  

通过观察、分析,在判断一个数是否为素数时,可以只判断2到该数范围内的前一半数就可以。所以对上边的代码可以做优化

n = 101
count = 0
for i in range(1, n, 2):  # 跳过偶数,但要记得2是素数
    for j in range(2, int(i ** 0.5) + 1):  # 这里做了优化,只对前一半数据进行判断
        if i % j == 0:
            break
    else:
        count += 1
        if i == 1:
            print(i)
            print(2)
        else:
            print(i)
print(‘count: {}‘.format(count + 1))  # count要加1是因为2这个素数

素数有一个这样的规律,一个较大的素数一定不能与一个较小的素数整除,根据这个规律可以用其他的方法求100内的素数

n = 101
lst = [2] 
for i in range(3, n, 2):
    for j in lst:
        if i % j == 0:
            break
    else:
        lst.append(i)
print([1] + lst)
# [1, 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]

求斐波那契数列和素数

标签:bre   个数   版本   方案   观察   pen   数据   循环   斐波那契数   

原文地址:https://blog.51cto.com/zhaochj/2526365

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!