再帰的な使用およびケース

5145 ワード

再帰
(1)メソッド定義でメソッド自体を呼び出す現象
例:お坊さんはお坊さんに物語を話して、私たちはプログラミングを学びます.
(2)再帰的注意事項;
A:再帰には必ず出口があります.そうしないと死んで再帰します.
B:再帰回数が多すぎてはいけません.そうしないとメモリが溢れてしまいます.
C:構築方法が再帰的に使用できない
(3)再帰例:
A:再帰的に階乗を求める
/*

 *   :       5   。

 *         :

 *         5! = 1*2*3*4*5

 *         5! = 5*4!

 *

 *         ?

 *         A:    

 *         B:    

 *             a:         

 *             b:    

 *             c:  

 */

public class DiGuiDemo {

    public static void main(String[] args) {

        int jc = 1;

        for (int x = 2; x <= 5; x++) {

            jc *= x;

        }

        System.out.println("5    :" + jc);



        System.out.println("5    :"+jieCheng(5));

    }

   
/*

     *          :

     *              :int

     *             :int n

     *     :

     *         if(n == 1) {return 1;}

     *   :

     *         if(n != 1) {return n*   (n-1);}

     */

    public static int jieCheng(int n){

        if(n==1){

            return 1;

        }else {

            return n*jieCheng(n-1);

        }

    }

}

 
 
B:ウサギ問題
 
/*

 *      ,     3            ,                   ,       ,              ?

 *   :         

 *                 

 *     :     1

 *     :    1

 *     :    2

 *     :    3   

 *     :    5

 *     :    8

 * ...

 *

 *             :

 *         1,1,2,3,5,8...

 *   :

 *         A:      ,         

 *         B:           

 *

 *          ?

 *         A:    

 *         B:       

 *         C:    

 *

 *               a,b

 *         :a=1,b=1

 *         :a=1,b=2

 *         :a=2,b=3

 *         :a=3,b=5

 *    :    a    b,       a+b   

 */

public class DiGuiDemo2 {

    public static void main(String[] args) {

        //       

        int[] arr = new int[20];

        arr[0] = 1;

        arr[1] = 1;

   

        for (int x = 2; x < arr.length; x++) {

            arr[x] = arr[x - 2] + arr[x - 1];

        }

        System.out.println(arr[19]);// 6765

        System.out.println("----------------");



        int a = 1;

        int b = 1;

        for (int x = 0; x < 18; x++) {

            //           a

            int temp = a;

            a = b;

            b = temp + b;

        }

        System.out.println(b);

        System.out.println("----------------");



        System.out.println(fib(20));

    }


 
  /*

     *   :      :int     :int n     :      1,     1   :        ,           

     */

    public static int fib(int n) {

        if (n == 1 || n == 2) {

            return 1;

        } else {

            return fib(n - 1) + fib(n - 2);

        }

    }

}


C:指定されたディレクトリの下にある指定された接尾辞名のすべてのファイルの絶対パスを再帰的に出力する

import java.io.File;



/*

 *   : E:\JavaSE      java                 。

 *

 *   :

 *         A:    

 *         B:                 File  

 *         C:   File  ,     File  

 *         D:   File        

 *              :  B

 *              :       .java  

 *                  :           

 *                  :    

 */

public class FilePathDemo {

    public static void main(String[] args) {

        //     

        File srcFolder = new File("E:\\JavaSE");



        //       

        getAllJavaFilePaths(srcFolder);

    }



    private static void getAllJavaFilePaths(File srcFolder) {

        //                  File  

        File[] fileArray = srcFolder.listFiles();



        //    File  ,     File  

        for (File file : fileArray) {

            //    File        

            if (file.isDirectory()) {

                getAllJavaFilePaths(file);

            } else {

                //        .java  

                if (file.getName().endsWith(".java")) {

                    //            

                    System.out.println(file.getAbsolutePath());

                }

            }

        }

    }

}




D:コンテンツ付きディレクトリを再帰的に削除(注意して使用)

/*

 *   :          

 *

 *   :

 *         A:    

 *         B:                 File  

 *         C:   File  ,     File  

 *         D:   File        

 *              :  B

 *              :   

 */

public class FileDeleteDemo {

    public static void main(String[] args) {

        //     

        File srcFolder = new File("demo");

        //     

        deleteFolder(srcFolder);

    }



    private static void deleteFolder(File srcFolder) {

        //                  File  

        File[] fileArray = srcFolder.listFiles();



        if (fileArray != null) {

            //    File  ,     File  

            for (File file : fileArray) {

                //    File        

                if (file.isDirectory()) {

                    deleteFolder(file);

                } else {

                    System.out.println(file.getName() + "---" + file.delete());

                }

            }

            System.out .println(srcFolder.getName() + "---" + srcFolder.delete());

        }

    }

}