再帰的な使用およびケース
5145 ワード
再帰
(1)メソッド定義でメソッド自体を呼び出す現象
例:お坊さんはお坊さんに物語を話して、私たちはプログラミングを学びます.
(2)再帰的注意事項;
A:再帰には必ず出口があります.そうしないと死んで再帰します.
B:再帰回数が多すぎてはいけません.そうしないとメモリが溢れてしまいます.
C:構築方法が再帰的に使用できない
(3)再帰例:
A:再帰的に階乗を求める
B:ウサギ問題
C:指定されたディレクトリの下にある指定された接尾辞名のすべてのファイルの絶対パスを再帰的に出力する
D:コンテンツ付きディレクトリを再帰的に削除(注意して使用)
(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());
}
}
}