再帰的アルゴリズムのJava言語プログラミング(14)アプリケーションの例、および配列のコピー、転送、および戻り

 1.配列のコピー

      プログラムでは、配列または配列の一部をコピーする必要があることがよくあります。この場合、最初に考えたのは、割り当てステートメントlist1 = list2を使用することですが、このステートメントは配列の内容をコピーしません。 list1によってlist2に参照され、list1の参照値をlist2にコピーするだけです。このステートメントの後、list1とlist2の両方が同じ配列を指し、list2によって最初に参照された配列が自動的に撤回されます。

      Javaでは、代入ステートメントを使用して基本データ型の変数をコピーできますが、配列をコピーすることはできません。配列変数を別の配列変数に割り当てることは、実際には参照コピーであるため、両方の変数が同じメモリアドレスを指します。

      配列をコピーするには、次の3つの方法があります。

    (1)loopステートメントを使用して、配列の要素を1つずつコピーします。

    (2)Systemクラスで静的メソッドarraycopyを使用します。

    (3)複製方法を使用してコピーします。これについては、後の記事で紹介します。

      ループを使用して、ソース配列の各要素をターゲット配列の対応する要素にコピーできます。たとえば、forループを使用してsourceArrayをtargetArrayにコピーします。

      int [] sourceArray = {2,1,5,4,8};

      int [] targetArray = new int [sourceArray.length];

          for(int i = 0; i <sourceArray.length; i ++){

              targetArray [i] = sourceArray [i];

}

      もう1つの方法は、ループを使用する代わりに、java.lang.Systemクラスのarraycopyメソッドを使用して配列をコピーすることです。arrarcopyの構文は次のとおりです。

      arraycopy(sourceArray、src_pos、targetArray、tar_pos、length);

      その中で、パラメーターsrc_posとtar_posは、それぞれソース配列sourceArrayとターゲット配列targetArrayの開始位置を表します。コピーされる要素の数は、パラメーターの長さによって指定されます。例を見てみましょう。

      System.arraycopy(sourceArray、0、targetArray、0、sourceArray.length);

      2.配列をメソッドに渡します

      以前にメソッドに渡された基本データと同様に、配列をメソッドに渡すこともできます。配列を渡して表示することで、printArrayメソッドを呼び出すことができます。

      3.メソッドから配列を返します

      メソッドを呼び出すときに配列をメソッドに渡すことができ、メソッドは配列を返すこともできます。たとえば、次のメソッドは、入力配列の逆の順序で配列を返します。

      public static int [] reverse(int [] list){

          int [] result = new int [list.length];

          for(int i = 0、j = result.length-1; i <list.length; i ++、j-){

               結果[j] =リスト[i];

               }

      結果を返します。

}

      4.再帰的アルゴリズム

       再帰とは何ですか?プロシージャまたは関数には、その定義または説明で直接または間接的に自分自身を呼び出すメソッドがあります。再帰関数は、自分自身を直接または間接的に呼び出す、つまり自分自身を呼び出す関数です。では、一般的に再帰を使用するのはいつですか?

   再帰は一般的に使用されるプログラミング手法であり、その基本的な考え方は「自分自身を呼び出す」ことです。再帰技術を使用する方法は、直接または間接的に自分自身を呼び出すことです。再帰的方法は、実際には「類推による」と「同じ手順で繰り返す」という考えを具体化しています。単純なプログラムを使用して複雑な計算の問題を解決できますが、計算量は比較的多くなります。
    二分木など、本質的に再帰的なデータ構造もあります。また、明らかな再帰構造を持たないタイプの問題もありますが、再帰プログラムを使用してプログラムを作成する方が、他の方法よりも簡単です。エイトクイーン問題、ハノイの塔問題などとして。

    再帰プログラムは普遍的であるため、問題を解決するために再帰を使用する方法を学ぶ必要があります。直接再帰プログラムと間接再帰の両方で、現在のレイヤーが次のレイヤーを呼び出すときにパラメーター転送を実現し、次のレイヤーから返される結果を取得し、上位レイヤーを呼び出して現在のレイヤーの結果を返す必要があります。各レイヤー呼び出しでのシーンの保存と復元については、手動の介入なしにプログラムによって自動的に実現されます。したがって、再帰プログラムの設計では、呼び出しに必要なパラメーター、返される結果、および再帰呼び出しの終了条件を見つけることが重要です。

      ここで、Javaアプリケーションの例を見て、正の整数の除算数などの再帰的アルゴリズムを適用します。たとえば、3は3 2 +1と1+ 1 + 1に分解でき、4は43に分解できます。 + 1、2 + 2、2 + 1 + 1、1 + 1 + 1 + 1、6は6 5 + 1、4 + 2、4 + 1 + 1、3 + 3、3 + 2 +1に分解できます、3 + 1 + 1 + 1、2 + 2 + 2、2 + 2 + 1 + 1、2 + 1 + 1 + 1 + 1、1 + 1 + 1 + 1 + 1 + 1、つまりaq(n、 m)意味が確立されるn個の正の整数を除算するために、mが制限であり、最大除算数がmを超えることはできないため、次の再帰的な関係を確立できます。

      q(n、m)= 1 ------- n = 1、m = 1

      q(n、m)= q(n、n)------ n <m

      q(n、m)= 1 + q(m、m-1)------ n = m

      q(n、m)= q(n、m-1)+ q(nm、m)------ n> m> 1

      プログラムリストは次のとおりです。

パッケージdigui;

java.util.Scannerをインポートします。

/ **
 *
 * @author john
 * /
public class Digui {
 public static int q(int n、int m){
  if(m <0 || n <0){
   return 0;
  }
  else if(m == 1 || n == 1){
   return 1;
  }
  else if(n <m){
   return q(n、n);
  }
  else if(n == m){
   return 1 + q(n、n --1);
  }
  else {
   return q(n、m --1)+ q(n --m、m);
  }
 }
 public static void main(String [] args){
  System.out.print( "nを入力してください\ n");
  スキャナー入力=新しいスキャナー(System.in);
  int n = input.nextInt();
  System.out.print( "mを入力してください\ n");
  int m = input.nextInt();
  int s = q(n、m);
  System.out.print(s);
 }

}

画像

      図に示すように、6 6と入力し、結果が11の場合、プログラムは正しいです。


おすすめ

転載: blog.51cto.com/15064656/2602766