2016-04-13 12 views
2

インタビュー質問:与えられた数kよりも少ない数のフィボナッチ数が存在しますか?フィボナッチ数の数をkより少なくするために、kの関数を見つけることができますか?番号kより小さいフィボナッチ数の数。 Sub O(n)

例:N = 6

回答:6十分

イージー(5、0、1、1、2、3)のように、ループを記述またはフィボナッチの再帰的定義を使用します。しかし、それはあまりにも簡単に聞こえます...クローズドフォーム定義を使ってこれを行う方法はありますか? (https://en.wikipedia.org/wiki/Fibonacci_number#Closed-form_expression

+0

なぜ誰かがこれを知る必要がありますか?それはちょうどパズルの質問、または宿題ですか? "sub O(n)"は、あなたがO(log(n))かO(1)を探している、または気にしていないという意味ですか? –

+0

これは非常に簡単かもしれないので、答えの上下限を受け入れるでしょうか。 –

+0

これはインタビューの質問です。それを編集として追加してみましょう。O(n) – Pinhead

答えて

2

ここには、O(1)である閉じた形式のPythonソリューションがあります。それは(あなたがにリンクされているウィキペディアの記事から)ビネーの式を使用しています。

>>> from math import sqrt,log 
>>> def numFibs(n): return int(log(sqrt(5)*n)/log((1+sqrt(5))/2)) 

>>> numFibs(10) 
6 

1,1,2,3,5,8

ポイントに追跡されているビネーの式で第二項無視することができ、それを無視するという結果を反転させるのは簡単です。

上記の式は、未満またはnに等しい数のフィボナッチ数をカウントします。新しいフィボナッチ数ごとに1ずつ飛びます。したがって、例えば、numFibs(12) = 6numFibs(13) = 7。 13番目のフィボナッチ数は、の数字がよりも小さい場合は、遅れを導入する必要があります。ような何か:

def smallerFibs(n): 
    if n <= 1: 
     return 0 
    else: 
     return min(numFibs(n-1),numFibs(n)) 

smallerFibs(13)は、これはまだ、もちろんO(1)でまだ6が、その後smallerFibs(14) = 7.です。

+0

これは素晴らしい説明です!ありがとう! – Pinhead

1

少なくとも、この数値の増加はかなり簡単だと思います。 Binet/De-Moivre formula

Fで N =(φ Nからψ N以来/ 5

| ψ | 1 < φ <、次いで

F N ∼ φ N/5。このことから

Xより小さいフィボナッチ数の数は、ログ φ(5X)ように成長することになります。

+0

平方根 –

関連する問題