标签:bre 个数 版本 方案 观察 pen 数据 循环 斐波那契数
所谓斐波那契数列指的是数列:1,1,2,3,5,8,13,21,……。用语言描述就是后一项等于前两项和。a = 1
b = 1
print(a)
print(b)
while True:
c = a + b
if c > 100:
break
a = b
b = c
print(c)
要点:
假设是从第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
此种方案把每次计算的结果以实参的形式传递给函数,这样效率很高。
如果一个整数只能被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