パブリック クラス テスト{
public static int getResult(int パラメータ) {
if (パラメータ == 0) { 結果を返します。 } それ以外 { 結果 *= パラメータ; return recursiveFunction(パラメータ - 1, 結果); }
戻り番号;
}
public static void main(String[] args) { //ここにコードを書きます }
int result = result(5);
System.out.println(結果);
}
}
その実行原理は次のとおりです:
result(5) まず、パラメータが1以下かどうかを判定する関数本体を入力しますが、このときパラメータは5で条件は成立しませんので、parameter*result(parameter-1)を実行します。 、つまり 5 * result(5-1)、プログラムを繰り返し実行します...
5*結果(5-1)
4*結果(4-1)
3*結果(3-1)
2 * result(2 - 1) この時点で、パラメータは 1 に等しく、条件を満たしているため、関数は 1 を返し、レイヤーごとに返します。今すぐ:###
結果(1) =12*結果(1)=2*1=2
3*結果(2)=3*2=6
4*結果(3)=4*6=24
5*結果(4)=5*24=120
Java の再帰的メソッドを使用して、n 個の数値を重複なく完全に配置します n 3
5
3 1 2 1 2 は、最初の行が数字であることを意味し、次に入力する数字の数を示します。 2 行目には、並べ替える数値を表す n 個の数値が含まれています。入力では、並べ替える数値がすべて非負の数値であると想定しています。
java.io.ファイルをインポート;
import java.io.FileNotFoundException;
import java.util.Arrays;
import java.util.Scanner;
パブリック クラス メイン {
静的最終 int maxn = 1000;
int n; //配列要素の数
int[] a; // 配列
boolean[] used; // 要素が再帰プロセス中に使用されたかどうかをマークするために使用される補助変数、used[i] は i 番目の要素が使用されたかどうかを示します
int[] cur; //現在の配置番号を保存
// 配置全体を重複せずに再帰的に印刷し、現在 idx 位置まで印刷します
void print_comb(int idx) {
idx == n の場合、最後の要素が走査され、cur を出力できることを意味します。
for(int i = 0; i if(i > 0) System.out.print(" ");
System.out.print(cur[i]);
}
System.out.println();
}
int last = -1; // 重複を避けるために、last 変数を使用して最後の検索の値を記録します
for(int i = 0; i if(used[i]) 続行;
if(last == -1 || a[i] != last) { // 現在の数値が繰り返されず、使用されていない場合にのみ、再帰が続行されます
last = a[i];
cur[idx] = a[i];
// バックトラッキング方法
used[i] = true;
print_comb(idx 1);
used[i] = false;
}
}
}
public void go() が FileNotFoundException をスローする { // メソッド本体を実装する }
{
Scanner in = new Scanner(new File("data.in")); 構文は、in という名前の Scanner オブジェクトを作成し、data.in という名前のファイルから入力を読み取るために使用します。
//データを読み取り、並べ替えます
n = in.nextInt();
a = 新しい int[n];
for (int i = 0; i Arrays.sort(a);
//補助変数を初期化し、重複のない完全な配置を開始します
cur = 新しい int[n];
used = 新しいブール値[n];
for(int i = 0; i print_comb(0);
in.close();
}
public static void main(String[] args) throws FileNotFoundException { これは Java プログラムの主要なメソッドであり、プログラム エントリを開始するために使用されます。このメソッドでは、ファイルの読み取り、データの処理などのいくつかの操作を実行できます。 このうち、throws FileNotFoundException は、実行中にファイルが見つからない例外が発生する可能性があることを示しており、この例外が発生した場合、プログラムは FileNotFoundException 例外をスローします。 このメソッドでは、ファイルの読み取りと例外処理を処理する特定のコード ロジックを作成できます。
new Main().go();
}
}客観的に言えば、非再帰的かつ非繰り返しの完全な置換は比較的単純で効率的です。
Java における再帰の役割は何ですか?再帰を使用する理由
再帰の役割: 再帰アルゴリズムは、再帰によって定義されるいくつかの問題を解決できます。
まず第一に、再帰定義の問題が何であるかを理解する必要があります。簡単に言うと、再帰的に定義された問題は、同じ構造でサイズが小さい小さな問題を含む大きな問題です。
たとえば、n 階乗の定義は次のように理解できます:
n!= n*(n-1)!
上記の分析から、(n-1)! は n! よりも小さい問題であると結論付けるのは難しくありません。この方法に従って問題を継続的に分解することにより、いくつかの基本的な既知のデータを得ることができます。次に、逆導出を通じて、最終結果を得ることができます。
n の階乗アルゴリズムは次のとおりです:
private static int jieCheng(int n) { これは階乗を計算する方法であり、パラメーター n は計算される値を表します。詳細な説明は次のとおりです。 - 「プライベート」とは、メソッドが現在のクラスでのみ表示され、他のクラスからアクセスできないことを意味します。 - 「静的」は、メソッドが静的メソッドであり、オブジェクトをインスタンス化せずにクラス名を通じて直接呼び出すことができることを意味します。 - 「int」は、メソッドが結果として整数値を返すことを意味します。 - 「jieCheng」はメソッドの名前で、必要に応じて名前を付けることができます。
if(n == 1)
1を返す;
###それ以外 {###n*jieCheng(n-1) を返す;
}
}
さらに、バイナリ ツリーの定義も再帰的です。つまり、多くのバイナリ ツリー操作が再帰によって実装されます。
再帰を使用すると、プログラムが非常に簡潔になります。
Java での再帰的アプリケーション! f20 1 f21 4 fn 2 2 fn 1 fnwhere
2
3
4
5
6
###7###8
9
10
11
12
13
14
15
16
17
パブリッククラステスト {
publicstaticintf(intn){
if(n==20){
return1;
}エルセイフ(n==21){
戻り4;
}elseif(n
returnf(n 2)-2*f(n 1);
###}それ以外{###return2*f(n-1) f(n-2);
}
}
public static void main(String[] args) {
System.out.println(f(10)); //f(10)の値を出力します
}
}
テスト済みです。main 関数に f(n) を入力します (n は手動で調整されたパラメーターです)。対応する出力結果が得られます。
以上がJavaの再帰アルゴリズムについて詳しく皆さんに解説していただきたいと思います。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。