今日では、顔の質問が発生する:1から、入力がn個であれば、N <= 1、F(N)= 1、そうでなければ、F(N)= F(N-1)+ F(N-2)、(n)は、印刷F nの値。
パブリック クラスフィボナッチ{ プライベート int型のn; 民間のStringBuilder SB; プライベート文字列の形式。 @Before 公共 ボイドのinit(){ N = 10 。 SB = 新しいStringBuilderの(N) 形式 = "F(%秒)=" 。 }
直接再帰的に実装:
/ ** *递归实现 * / @Test 公共 ボイド再帰(){ ため(int型、iがn = <; I = 1 iは++ ){ sb.delete( 0 、N); sb.append(String.Formatの(フォーマット、I))。 sb.append(再帰(I)); System.out.println(sb.toString())。 } } プライベート int型再帰(int型N){ 場合(N <= 1 ){ 返す 1 。 } 他{ リターン再帰(N - 1)+再帰(N - 2 )。 } }
次のようにテスト結果は以下のとおりです。
インタビュアーは、達成するための循環ループと言いました:
/ ** *ループ実現のため * / @Test 公共 ボイドFORI(){ IF(N - <= 1 ){ System.out.printlnは( 1 ); } int型 J = 1、K = 1。。; int型SUM; のための(INT 2 = I; I <= N; Iは++ ){ // 。F(N)= F(N - 1)+ F(N-2-) // F(N-1として、j)を、FとしてK(N- 2) SUM = J + K; K = J; J = SUM; sb.delete( 0 、N-)。 sb.append(String.Formatの(フォーマット、I))。 sb.append(合計)。 System.out.println(sb.toString())。 } }
次のようにテスト結果は以下のとおりです。
彼は、コードが再びより、合理化、効率的に変更することができ、言いました:
/ ** *より効率的に実装するためのループ * / @Test 公共 ボイドforEfficient(){ IF(N - <= 1 ){ System.out.printlnは( 1 ); } int型。TEMP = 1 ; int型。SUM = 1 ; のための(INT 2 = I; I <= N; Iは++ ){ // fは(N)F(N - 1)+ F(2-N-)= // 和F(N-1と、このケース)、FとしてTEMP( )-N- 2 和=和+ TEMP; // 計算合計であるF(N) // 。TEMP = F(N - 1)= F(N) - F(N-2-) TEMP =合計- 一時。 sb.delete( 0 、N); sb.append(String.Formatの(フォーマット、I))。 sb.append(合計)。 System.out.println(sb.toString())。 } }
次のようにテスト結果は以下のとおりです。
いくつかの質問に関連するプログラミングの問題の背後にあるフェイス:
無秩序な配列に、最初に見つけ Kに大きな数を
例えば、 23、5、7、2、の2 大きい数である7 。
クイックパーティションなどの機能、 10 数、最初の検索5 多数の添字場合、降順で、高速行の後、返された2は、全てよりも、この番号の最後の位置であり、この番号左それは、彼が少しあったより右側のすべての数字大きいし、次に見つけ3-9 の数字が可能パーティション......
ある場合の規則的な配列に関連する問題は、それは考えるべきであるバイナリサーチによると、配列の添字の半分!
プログラミングの問題の多くは、単に学校の募集で感じる、リクルートコミュニティはそれを行うために考える必要があります。