4

割り当てのために、フィボナッチ関数を定義するように求められました。これは次のようにして実現しました。

def fibonacci(n):
    if n < 2:
        return n
    return fibonacci(n-1) + fibonacci(n-2)

ただし、階乗関数などの再帰関数が次のように 1 行の return ステートメントで定義されているのを見たことがあります。

def factorial(n):
    return n > 1 and n * factorial(n-1) or 1

そこで、同じことをフィボナッチ関数に適用しようとしました。何度か試行した後、s = 0 の場合を除いて、テストしたすべてのケースで機能するようになりました。この場合、0 を返す必要があるときに False を返します。

def fibonacci(n):
    return ((n == 0 or n == 1) and n) or (n > 1 and (fibonacci(n-1) + fibonacci(n-2)))

Python は 0 を False に評価することを理解しています。コードの現在の長さ/構造を維持しながら、n が 0 の場合、Python が False ではなく 0 を返すようにするにはどうすればよいでしょうか? それは可能ですか?

また、関数を作成するこのスタイル(再帰的またはその他)は、教科書バージョンよりも多かれ少なかれ望ましい/ Pythonicですか?(読みやすさのためだけではないと思います)

明確にするために、私は課題の要件を満たしています。個人的な知識としてのみ、返品明細書で何が起こっているかをより明確に理解したいと思います.

4

2 に答える 2

10

偽物の場合、イディオムはx and y or z機能しません。条件を入れ替えて、それでも機能させることができます。y

def fibonacci(n):
    return n >= 2 and fibonacci(n-1) + fibonacci(n-2) or n

ただし、Python 2.5(6年前にリリース)の時点では、適切な条件式and/orがあり、ハックする必要はありません。

def fibonacci(n):
    return n if n < 2 else fibonacci(n-1) + fibonacci(n-2)

現在、これは指数関数的な実行時の複雑さを持っています。効率的にしたい場合は、次のO(n)アルゴリズムを使用してください。

def fibonacci(n):
    a, b = 0, 1
    for _ in range(n):
        a, b = b, a + b
    return a

または、ジェネレーターを作成してすべての数値を生成し、必要な数だけ取得することもできます。

于 2012-05-09T19:36:49.197 に答える
1

おそらくこれはそれをより明確にします:

def fibonacci(n):
    print ((n == 0 or n == 1) and n)
    print (n > 1 and (fibonacci(n-1) + fibonacci(n-2)))
    return ((n == 0 or n == 1) and n) or (n > 1 and (fibonacci(n-1) + fibonacci(n-2)))


print 0 or False
print False or 0
于 2012-05-09T19:38:19.860 に答える