斐波那契数列

top啦它 2020-03-13 09:57:26
我感觉我的代码傻乎乎的,大神们能帮我优化一下吗,多谢了。
多谢了

def isprise(n):
a = [1,2]
b = []
c = []
d = []
s = 0
while True:
b = a[-2:]
for i in b:
s += i
a.append(s)
s = 0
for ii in a[-1:]:
iii = ii
if iii > n - 1:
break
del a[-1:]
for key in a:
if key % 2 == 0:
d.append(key)
return sum(d)
print(isprise(int(input())))



题目内容:
一个斐波那契数列的前10项为:1, 2, 3, 5, 8, 13, 21, 34, 55, 89,对于一个最大项的值不超过n的斐波那契数列,求值为偶数的项的和。

输入格式:
一个正整数n,如100。

输出格式:
值为偶数的项的和,如 2 + 8 + 34 = 44。

输入样例:
100

输出样例:
44

我感觉我的代码傻乎乎的,大神们能帮我优化一下吗,多谢了。
...全文
172 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
陈年椰子 2020-03-13
  • 打赏
  • 举报
回复
我那个 代码是 百度 的 , 改了一下,没详细研究。
冰风漫天 2020-03-13
  • 打赏
  • 举报
回复
二楼的代码不错,不过好像有点小bug,输入33可验,max -= 1应该不需要,max应该大于b

#建立数列
def fib_loop_while(max):
    a, b = 0, 1
    while max > b:
        a, b = b, a + b
        # max -= 1
        yield a

#计算偶数值项
def isprise(n):
    return sum([i if i % 2 ==0 else 0  for i in fib_loop_while(n)])

print(isprise(int(input())))
简单点可以这么写

def isprise(n):
    a,b,s = 1,2,0
    while b <= n:
        if b % 2 == 0:
            s += b
        a,b = b, a+b
    return s

print(isprise(int(input())))
nieoding 2020-03-13
  • 打赏
  • 举报
回复
二楼的代码用到了生成器,如果输入的数字非常巨大的话,性能是更优的
nieoding 2020-03-13
  • 打赏
  • 举报
回复

from functools import reduce


def fibonacci_limit(n):
    rs = []
    a, b = 0, 1
    while b < n:
        rs.append(b)
        a, b = b, a + b
    return rs


def fibonacci(n):
	source = fibonacci_limit(n)
	data_even = filter(lambda x: not x % 2, source)
	return reduce(lambda x, y: x+y, list(data_even))


source = input('请输入一个上限:')
print(fibonacci(int(source)))

给一些建议: 1. 实现一个功能,不能就想着一个函数去完成所有功能,而应该做简单的功能分拆,例如,一个函数(fibonacci_limit)去生成数据源,一个函数(fibonacci)去完成运算,这样代码有复用性,逻辑也清晰一点 2. python内置很多工具函数(map, filter, reduce)利用起来, 没必要自己再写算法,虽然也简单,但是累不累 3. 学习一下lambda,保持代码简洁 4. 变量命名要有意义,不要a,b,c,d,ii,iii这样子,别人看不懂,自己以后也看不懂 5. 如果代码简洁,代码注释可以不用怎么写,如果代码长逻辑复杂,关键点还是需要加注释的 6. 给IDE安装PEP8检测器,尽量按规范去写代码
陈年椰子 2020-03-13
  • 打赏
  • 举报
回复

#建立数列
def fib_loop_while(max):
    a, b = 0, 1
    while max > a:
        a, b = b, a + b
        max -= 1
        yield a

#计算偶数值项
def isprise(n):
    return sum([i if i % 2 ==0 else 0  for i in fib_loop_while(n)])

print(isprise(int(input())))
top啦它 2020-03-13
  • 打赏
  • 举报
回复
多谢了
top啦它 2020-03-13
  • 打赏
  • 举报
回复
引用 3 楼 nieoding 的回复:

from functools import reduce


def fibonacci_limit(n):
rs = []
a, b = 0, 1
while b < n:
rs.append(b)
a, b = b, a + b
return rs


def fibonacci(n):
source = fibonacci_limit(n)
data_even = filter(lambda x: not x % 2, source)
return reduce(lambda x, y: x+y, list(data_even))


source = input('请输入一个上限:')
print(fibonacci(int(source)))




给一些建议:

1. 实现一个功能,不能就想着一个函数去完成所有功能,而应该做简单的功能分拆,例如,一个函数(fibonacci_limit)去生成数据源,一个函数(fibonacci)去完成运算,这样代码有复用性,逻辑也清晰一点
2. python内置很多工具函数(map, filter, reduce)利用起来, 没必要自己再写算法,虽然也简单,但是累不累
3. 学习一下lambda,保持代码简洁
4. 变量命名要有意义,不要a,b,c,d,ii,iii这样子,别人看不懂,自己以后也看不懂
5. 如果代码简洁,代码注释可以不用怎么写,如果代码长逻辑复杂,关键点还是需要加注释的
6. 给IDE安装PEP8检测器,尽量按规范去写代码
多谢
top啦它 2020-03-13
  • 打赏
  • 举报
回复
引用 5 楼 冰风漫天 的回复:
二楼的代码不错,不过好像有点小bug,输入33可验,max -= 1应该不需要,max应该大于b

#建立数列
def fib_loop_while(max):
a, b = 0, 1
while max > b:
a, b = b, a + b
# max -= 1
yield a

#计算偶数值项
def isprise(n):
return sum([i if i % 2 ==0 else 0 for i in fib_loop_while(n)])

print(isprise(int(input())))


简单点可以这么写

def isprise(n):
a,b,s = 1,2,0
while b <= n:
if b % 2 == 0:
s += b
a,b = b, a+b
return s

print(isprise(int(input())))
多谢
top啦它 2020-03-13
  • 打赏
  • 举报
回复
引用 2 楼 陈年椰子 的回复:

#建立数列
def fib_loop_while(max):
a, b = 0, 1
while max > a:
a, b = b, a + b
max -= 1
yield a

#计算偶数值项
def isprise(n):
return sum([i if i % 2 ==0 else 0 for i in fib_loop_while(n)])

print(isprise(int(input())))
多谢

37,720

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧