Python: 斐波那契数列

9 投票
11 回答
15162 浏览
提问于 2025-04-17 18:28

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

我想用斐波那契数填充一个列表,但我觉得我的代码给出的结果是把所有数字加在一起的总和,而不是我想要的斐波那契数值。

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

我哪里出错了呢?

11 个回答

2

问题出在最后一行。我敢肯定这是个干扰:你应该打印的是列表,而不是a

还有一些其他的小建议:

1: 这一整段代码其实只是重新创建了range返回的列表:

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

i = 0赋值也没什么必要。你可以试试:

numberlist = range(20)

在Python 3中,调用list(range(20)),因为range并不会生成一个完整的列表。

2: 在每次循环中重新定义fib函数虽然不会出问题,但其实没必要。把定义移到外面去就行了 :)

2

抱歉,我真是个傻瓜。我打印的是'a',也就是斐波那契数列最后一次计算的结果。

我应该打印我的列表才对。

真是的...

12
print a
numberlist = []
i = 0
for i in range(20):
    numberlist.append(i)
numberlist = list(range(20))
def fibGenerator():
    a, b = 0, 1
    yield 0
    while True:
        a, b = b, a + b
        yield a

fibonaccinumbers = []
fib = fibGenerator()
for n in range(20):
    fibonaccinumbers.append(next(fib))
fibonaccinumbers = take(20, fibGenerator())
>>> def example():
    print('begin')
    i = 0
    while True:
        print('Calculating next value')
        yield i
        i += 1

>>> g = example()
>>> next(g)
begin
Calculating next value
0
>>> next(g)
Calculating next value
1
>>> next(g)
Calculating next value
2
>>> next(g)
Calculating next value
3
>>> next(g)
Calculating next value
4

好吧,你需要打印出最后的值。


还有一些关于你代码的建议:

你其实不需要在那儿初始化 i,因为 for 循环会自动帮你处理这个。此外,你可以通过这样做来简化整个代码块:

而且,既然你并不需要把它做成一个列表,其实根本不需要构建那个列表,你可以直接在后面运行 for n in range(20)

另外,你在循环里面一次又一次地重新定义你的 fib 函数。你应该把它定义在循环外面,然后重复使用它。

还有,当你知道想要创建多个斐波那契数的时候,把你计算的所有数字存起来会很有帮助。这样你就不需要重复做同样的事情。你也可以使用生成器函数来让这一切变得更简单:

与其在一个范围内循环并手动调用 next 来获取生成器的下一个值,你可以直接使用 take-食谱,这样做就像这样:

关于生成器

不过我还是不太明白生成器到底是干嘛的。

生成器是一个 Python 函数,它可以生成一系列返回值。这些值是懒惰生成的,也就是说,只有在你请求的时候才会生成。你只需使用 yield 代替 return 来创建一个生成器。一个 yield 会“返回”一个值并暂停生成器。下次你请求一个值时,生成器会从它暂停的地方继续。

使用生成器可以让你创建一个无尽的序列。正如你在上面 fibGenerator 的定义中看到的,有一个无尽的 while 循环,里面有一个 yield。生成器停止时,尽管有这个循环,它也不会卡住。

这里有一个简单的自我解释的例子:

next 函数是一个内置函数,用于请求 可迭代对象 的下一个值。可迭代对象是指任何你可以进行迭代的东西(例如 for x in iterable: ...);而任何生成器也是可迭代的。

撰写回答