二日目の質問01

  ここでも2ヵ月後、ブログは7月14日、時間あるか、最後の時間はあまりにも速く、そして疑問は、なぜこれほど長い間、それの何も書いていないのですか?それは醤油でますか?

  ハハ、それを言うことは非常に恥ずかしい、ちょうど行くことを学ん解決するために、さまざまな問題に直面しようとして、作業を開始し、その後、ブログが低下している大手、いくつかの奇妙なものを学ぶために時間を割いに行きました、そして最終的な分析で、または心はいつも少しリラックスして仕事から、今日の仕事の日を感じるので、自分の怠惰、。自分のより多くのリラックスを作り、彼らは少し先延ばしされているので、また、あなたがドラッグされていた何かを書きたい、自分自身がこの心理的な快適さで無意識。

  ╮(¯▽¯「)╭ねえ、常に基盤は依然として、アマチュア基礎を演奏労働時間を考えると、ビジネス・ロジックの枠組みを書くために見て十分にしっかりしている感じるくらいの最近のソースを見て何を、言ってあまり話をしませんでしたします。https://何か興味を持っている、あなたがかむことができるより多くをかみ切る、タイトル選択したプランを勝ち、ずっと、毎日2つの質問のことを基礎を敷設、良いはずはgithubのああ、リンクで自分で見ることができますgithub.com/CyC2018/CS-Notes

 

最初の質問:フィボナッチ数

  トピック説明:我々は、すべての今、フィボナッチ数、および整数nは、あなたの輸出品目のnフィボナッチフィボナッチ数列を入力するよう求めていることを知っています。N <= 39

  

  私は考えていた:フィボナッチ列は何上記のようにまだ少し式を知っている必要があり、単に第3の数から出発して、前の二つの数字の数字のいずれか等しいことを意味し、例えば0、1 、1,2,3,5,8,13,22 .......そして最も単純なアイデアは、以下のコードを見て、再帰を使用することです。

パブリック クラスStudy01 { 

    パブリック 静的 INT feibo(INT N-){
         // 次に、再帰出口を覚えておく必要があり、もし次の二つを有しており、そこであろう無限ループ
        IF(N - == 0 ){
             戻り 0 ; 
        } 
        IF( N - == == || 1、N-2 ){
             リターン 1。; 
        } 
        リターン。feibo(1-N-)feibo +(2-N- ); 
    } 
    
    公共の 静的な 無効メイン(文字列[]引数){ 
        
        int型。RES = feibo(6 ) ; 
        のSystem.out.println(RES); // 8。

    } 
}

   上記コードが書かれているが、最適化は、それが再帰値は、いくつかの反復計算のようなfeiboにつながる可能性があるため(5)= feibo(4)+ feibo(3)= [feibo(3)+ feibo(2) ] + feibo(3)、コンピュータは、コンピュータが計算し人々ああ、一度計算feibo(N)のような用語のように結合しないことができる2つのfeibo(3)を算出ここで、nの値がかなりの時間、再帰的な計算過程で、このようなダブルカウント数の多いだろうし、我々はそれを排除するために、このような繰り返しの数を計算する方法がありませんか?一度だけ、それを保存して計算し、次の再計算は、直接十分に得ます。

  

  1改善:アレイを作成し、我々は、n = 0で開始し、配列にそれぞれの計算された数は、その後、N番目の位置の配列番号は、我々が必要とする結果であります

// 改善された方法1。
    パブリック 静的 INT feiboUp01(INT N-){
         IF(N - == 0 ){
             戻り 0 ; 
        } 
        IF(N-N- || 1 == == 2 ){
             リターン 1。; 
        } 
        INT [] = ARR 新しい新 INT [N- + 1 ]; 
        ARR [ 0] = 0 ; 
        ARR [。1] = 1 ; 
        ARR [ 2] = 1 ;
         // このループ意志も配列に値を充填するたびに、アウトARR計算されるまで、[N] 
        以下のためのint型 I = 3; I <= N; I ++){ 
            ARR [I] =のARR [I-1] + ARR [I-2 ]。
        } 
        戻りARR [N]; 
    } 
    
    パブリック 静的 ボイドメイン(文字列[]引数){ 
        
        int型 RES = feiboUp01(6 )。
        System.out.println(RES)。// 8 

    }

 

  

  改良された2:私は、配列の賢い利用かかわらず、このアプローチの上に発見した、しかし、私たちのために、配列の最後の数を除いて、他の数字はまったく必要ありませんかどうか知りませんが、非常に大きなnは計算しません。 、それはそんなに新しい配列必要がありますか?だから我々はそれを改善し続けることができます。

// 改善実施例2 
    パブリック 静的 INT feiboUp02(INT N-){
         IF(N - == 0 ){
             戻り 0 ; 
        } 
        IF(|| N-N-1 == == 2 ){
             リターン 1 ; 
        } 
        // ここでは3現在の時間が5である場合、予め例えば0,1,1,2,3,5などの変数は、prepreで2、3である
        INT。prepre = 1 ;
         INT。予備= 1 ;
         INT電流= 0 ;
         // ここで少し悪いです前の3つの電流prepreの数が理解
         // 1サイクル後、電流= prepre +事前に計算され、この時にも右に予めprepreつの位置
        // 現在、オリジナルprepre向けオリジナルPREが予め今向かう
        ためINT。; I <= N; I ++はI = 3 ){ 
            電流 = prepre + プリ; 
            prepre = プレ; 
            事前 = 現在; 
        } 
        戻り現在; 
    } 
    パブリック 静的 ボイドメイン(文字列[]引数){ 
        
        int型 RES = feiboUp02(6 
        のSystem.out.println(RES); 

    }

 

 

 2番目の質問:私たちは2×1の小さな四角形で大きな矩形をカバーするために横または縦方向に行くことができます。n個の2×1の小さな四角形は、2xNの重なることなくどのように多くの方法の合計を大きな四角形をカバーしていますか?

  この問題は、実際にはまだ数をフィボナッチているが、子アイデアは、一般的に私達は行くどのように多くの方法、時間、描画コンピューティングに行くことができる計算する方法を見つけ、非常に興味深いですが、ここではそれは大きな問題は、サブ問題にダウンしている、と問題を分割し続けることができます...

  N = 1の場合、一つだけの場合、

  n = 2で、2つだけ、または2つの2は、垂直及び横の両方である場合

 

   

  N = 3で、次に問題になる場合は3つの2x1の小さな長方形の非重複充填が示すように、横置きされていること、2×3の大きな矩形と、第1のケースをカバーし、必要な残りNの充填に相当する= 2、すなわち、2×2の場合、2番目のケースは、再び必要、その後、残りはN = 1の場合であり、充填充填されている端の最初のものです。

             

 

   場合N =残りがあることを2例、横が充填された最初のケ​​ースは、ある5、N = 4など、; 2つの垂直に第二ケースを充填し、残りはNと等価です3 =種類、以下の一般式は、上記コードワードとは言わない、基本的に同じである、と言っていません。

 

 

 

   これら二つのトピック、非常に興味深いです、あなたが式を見てみましょうするためのコードを書くためのトピックであると言うことができる、およびその他のは、実際に分割統治を使用してトピックである、いわゆる分割統治、分割統治です。元の問題は、再帰的にこれらの問題を解決し、次に統合プロセスを解決するため、小さな問題でNより小さいサイズ、構造及び元の問題同様の取引に分割されています。

おすすめ

転載: www.cnblogs.com/wyq1995/p/11530937.html