I.概要
再帰:それは、現在の方法で自分自身を呼び出す現象をいいます。
再帰カテゴリー:
-
- 再帰的に2種類、直接再帰と再帰的なプロフィールに分け
- 直接的な方法は、自分自身を再帰的に呼ばれる自分自身を呼び出します
- 間接再帰はCメソッド呼び出し方法、方法B方法A、BメソッドCメソッド呼び出しと呼ぶことができます。
- 再帰的に2種類、直接再帰と再帰的なプロフィールに分け
注意:
-
- 再帰はそれ以外の場合は、スタックメモリのオーバーフローが起こるのだろう、再帰を停止することができる条件を保証する必要があります。
- そこには、再帰的な条件で定義されてではなく、あまりにも多くの再帰されていますが、コンテンツ剛ゼスタックオーバーフローが発生します。
- 施工方法、バイナリ再帰。
スタックオーバーフローメモリへの再帰的原則リード:
第二に、ケース
1、再帰累積和
1と、蓄積されたNを計算し、N = N +(N + 1)と疲れは、再帰呼び出しの操作方法として蓄積と定義することができます。
実装:
1つの パブリック クラスデモ{
2 公共 静的 ボイドメイン(文字列[]引数){
3 //が計算され、1〜numが、再帰完了
4。 INT NUM = 5 ;
5 // メソッド呼び出し合計
6 int型 SUM = GetSum( NUM);
7。 // 出力
8 のSystem.out.println(SUM);
9。 }
10 / *
11。 再帰アルゴリズムによって実現。
12 パラメータのリスト:int型
13は、 戻り値の型:int
14 * /
15 パブリック 静的 INTをGetSum(INT NUM){
16 / *
。17 NUMは、本方法は1を返し、1であり、
18は NUMは常に1でエクスポート処理に対応する
。19 * /
20は、 IF(NUM == 1 ){
21が 返す 1 ;
22れます }
23は / *
24 、NUM 1が返されていないメソッドNUM +(NUM-1)及び累積
25 GetSum再帰呼び出し
26は、 * /
27 戻り NUM + GetSum(NUM-1 );
28 }
29 }
コードの実行イラスト:
注意:再帰制限は、それ以外の場合は、スタックメモリのオーバーフローが起こるのだろう、ではないの数があまりにも多く、その再帰を停止することができることを確認するために修飾する必要があります。
2、再帰的な階乗
階乗:未満と数に等しい、すべての正の整数の積。
分析:n! = n * (n-1);
实现:
1 public class DiGuiDemo {
2 //计算n的阶乘,使用递归完成
3 public static void main(String[] args) {
4 int n = 3;
5 // 调用求阶乘的方法
6 int value = getValue(n);
7 // 输出结果
8 System.out.println("阶乘为:"+ value);
9 }
10 /*
11 通过递归算法实现.
12 参数列表:int
13 返回值类型: int
14 */
15 public static int getValue(int n) {
16 // 1的阶乘为1
17 if (n == 1) {
18 return 1;
19 }
20 /*
21 n不为1时,方法返回 n! = n*(n‐1)!
22 递归调用getValue方法
23 */
24 return n * getValue(n ‐ 1);
25 }
26 }
3、递归打印多级目录
分析:多级目录的打印,就是当目录的嵌套。遍历之前,无从知道到底有多少级目录,所以我们还是要使用递归实现。
实现:
1 public class DiGuiDemo {
2 public static void main(String[] args) {
3 // 创建File对象
4 File dir = new File("D:\\aaa");
5 // 调用打印目录方法
6 printDir(dir);
7 }
8 public static void printDir(File dir) {
9 // 获取子文件和目录
10 File[] files = dir.listFiles();
11 // 循环打印
12 /*
13 判断:
14 当是文件时,打印绝对路径.
15 当是目录时,继续调用打印目录的方法,形成递归调用.
16 */
17 for (File file : files) {
18 // 判断
19 if (file.isFile()) {
20 // 是文件,输出文件绝对路径
21 System.out.println("文件名:"+ file.getAbsolutePath());
22 } else {
23 // 是目录,输出目录绝对路径
24 System.out.println("目录:"+file.getAbsolutePath());
25 // 继续遍历,调用printDir,形成递归
26 printDir(file);
27 }
28 }
29 }
30 }