Python:斐波那契数列

9

我只是想通过编写一些基本函数来提高我的编程技能。

我想用斐波那契数列值填充一个列表,但我认为我的代码给出了所有数字的总和并打印该值。

numberlist = []
i = 0
for i in range(20):
    numberlist.append(i)

print numberlist

fibonaccinumbers = []

for n in numberlist:
    def fib(n):
        a, b = 0, 1
        for i in range(n):
            a, b = b, a + b
        return a
    a = fib(n)
    fibonaccinumbers.append(a)


print a

我哪里做错了?


4
任何以“我一直在努力提高我的技能”开头的问题都应该得到点赞和立即关注。 - salezica
“a,b = b,a+b”:这是一种令人困惑的赋值方式!我知道它是有效的,但我无法不认为它不应该被允许。 - lucasg
4
在Python中,a, b = b, a + b是完全可以的。 - jfs
2
@georgesl,一旦你习惯了它,你会想知道为什么其他语言不能像多个返回值一样干净。 - Jason Sperske
1
@DaBx 我说的完全是实话!提高自己是程序员最崇高的目标。 - salezica
显示剩余3条评论
11个回答

0

由于每个斐波那契数都是从之前的所有数生成的,因此从头开始计算每个数是没有意义的。更好的方法是使用您正在收集斐波那契数的列表来计算每个后续数:

def FibList(n):
    rc = []
    for i in xrange(n):
        if i < 2:
            rc.append(1)
        else:
            rc.append(rc[i-2] + rc[i-1])

    return rc

print FibList(20)

如果你想要更加优雅,你可以创建一个生成器函数来计算斐波那契数列的值,并使用它来构建你的列表:
def Fib(n):
    n1 = 1
    n2 = 1

    for i in xrange(n):
        if i < 2:
            yield 1
        else:
            n3 = n1 + n2
            n1 = n2
            n2 = n3
            yield n3

fiblist = [x for x in Fib(20)]
print fiblist

在生成器函数中,'yield' 关键字返回列表的每个值。 fiblist 使用称为“列表推导式”的东西构建一个使用生成器的列表的行。您还可以在 for 循环中使用生成器:
for fnum in Fib(20):
    print fnum

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接