0

指定された最大値までの fib 番号のリストを返す単純な python 関数を作成しようとしました。しかし、私はこのエラーが発生しています。私は自分が間違っていることを見つけることができないようです。

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リストをその場で拡張します。演算子を使用して、+2 つのリストを連結できます。

ただし、コードは特に 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

Python 3.2 以降でしか動作しませんが、特にきちんとした Fibonacci の実装に興味があるかもしれません:

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

最初の行のポイントは、再帰呼び出しをメモすることです。言い換えると、たとえば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 に答える