トピック:、関数を書く入力N、項目の最初のフィボナッチ数フィボナッチ数列を求めます。次のように定義されたフィボナッチ数列証書:
1、効率は非常に非効率的なソリューションである、目の肥えたインタビュアーが好きではありません
再帰的な実装:
パブリック クラスフィボナッチ{ 公共 長い getNum(int型N){ 場合(N <= 0 ){ 戻り 0 ; } そう であれば(N == 1 ){ リターン 1 。 } 他{ 戻り getNum(N-1)+ getNum(N-2 )。 } } }
ノードの多くは風雲ツリーに複製され、そしてnは増加が劇的に増加すると、ノードの数は量が急激に増加し、n個の増加として計算されることを意味し、繰り返しになるがあることが私たちを見つけます。実際には、再帰的なNの方法による計算の時間複雑度が指数インクリメントされます。読者は、この再帰がどの程度に減速する感じ、最初の100フィボナッチの試みを模索したいと思うかもしれません。
2、インタビュアーは、適切な解決策を探して:
実際には、改良された方法は、複雑ではない、計算の数を減らす、計算中期保存
パブリック クラスfibonacci2 { パブリック ロング getNum(INT N-){ IF(N - == 0 ){ 戻り 0 ; } IF(N - == 1 ){ リターン 1。; } int型 TEMP1 = 0; // アイテムのN 2値 int型 =のTEMP2 1; // アイテムのN-1値 のint結果= 0; //は、計算の中間結果を保存する ための(int型 I = 2と、I <= N; Iは++ ){ 結果 = TEMP1 + のTEMP2、 TEMP1 =TEMP2; TEMP2 = 結果; } 戻り値の結果; } }