0

我试图编写一个简单的 python 函数,它应该返回 fib 数字列表,直到某个指定的最大值。但我收到了这个错误。我似乎无法找出我做错了什么。

def fib(a,b,n):
    f = a+b
    if (f > n):
        return []
    return [f].extend(fib(b,f,n))

>>>fib(0,1,10)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "lvl2.py", line 35, in fib
    return [f].extend(fib(b,f,n))
  File "lvl2.py", line 35, in fib
    return [f].extend(fib(b,f,n))
  File "lvl2.py", line 35, in fib
    return [f].extend(fib(b,f,n))
  File "lvl2.py", line 35, in fib
    return [f].extend(fib(b,f,n))
TypeError: 'NoneType' object is not iterable
4

2 回答 2

9

list.extend就地扩展列表。您可以使用+运算符将​​两个列表连接在一起。

但是,您的代码并不是特别 Pythonic。您应该使用生成器来生成无限序列,或者作为对代码的轻微改进:

def fib(a,b,n):
    data = []
    f = a+b
    if (f > n):
        return data
    data.append(f)
    data.extend(fib(b,f,n))
    return data

使用生成器生成无限序列的示例:

def fibgen(a, b):
    while True:
        a, b = b, a + b
        yield b

您可以使用 创建生成器fibgen()并使用 提取下一个值.next()

于 2011-04-23T08:26:04.777 回答
1

您可能对一个特别简洁的 Fibonacci 实现感兴趣,尽管它仅适用于 Python 3.2 及更高版本:

@functools.lru_cache(maxsize=None)
def fib(n):
    return fib(n-1) + fib(n-2) if n > 0 else 0

第一行的重点是记住递归调用。换句话说,计算 eg 的速度很慢fib(20),因为你会重复很多工作,所以我们在计算值时缓存它们。

这样做可能仍然更有效

import itertools
def nth(iterable, n, default=None):
    "Returns the nth item or a default value"
    return next(islice(iterable, n, None), default)
nth(fibgen())

如上,因为它没有大缓存的空间开销。

于 2011-04-23T08:46:48.297 回答