遞歸執行個體
/**
* 對遞歸進行訓練
*
* @author Clearlight
*
*/
public class _07_遞歸 {
public static void main(String[] args) {
System.out.println(f1(3)); // n的階乘
System.out.println(f2(new int[] {1,1,2,3,4},0)); // 對arr的所有元素求和,從頭開始
System.out.println(f21(new int[] {1,1,2,3,4},4)); // 對arr的所有元素求和,從尾開始
System.out.println(f3("abcde",4)); // 翻轉字元串
System.out.println(f4(6)); // 斐波那契數列
System.out.println(f5("aaab","aaa")); // 比較兩個字元串是否相等
}
/**
* 需求:遞歸求解階乘
*
* 思路:
* f(n):求n的階乘-->f(n-1)求n-1的階乘
* 找重複:n*(n-1)的階乘,求n-1的階乘是原問題的重複(規模更小)-子問題
* 找變化:變化的量應該作為參數
* 找邊界:出口
*
* @param n 開始的數
* @return 傳回結果
*/
static int f1(int n) {
if (n == 0) {
return 1;
}
return n * f(n - 1);
}
/**
* 需求: 對arr的所有元素求和,a[begin] + (begin+1...結束)
*
* @param arr
* @param begin
* @return
*/
static int f2(int[] arr, int begin) {
if(begin == arr.length-1) {
return arr[begin];
}
// 類似踢皮球
return arr[begin] + f2(arr,begin+1);
}
/**
* 需求: 對arr的所有元素求和,a[end-1...0) + a[end]
*
* @param arr
* @param end
* @return
*/
static int f21(int[] arr, int end) {
if(end == 0) {
return arr[0];
}
return arr[end] + f2(arr, end-1);
}
/**
* 需求: 翻轉字元串
*
* @param src
* @param end
* @return
*/
static String f3(String src, int end) {
if(end == 0) {
return "" + src.charAt(0);
}
return src.charAt(end) + f3(src, end-1);
}
/**
* 需求: 求斐波那契數列
*
* @param n 第n個位置
* @return 傳回第n個位置的值
*/
static int f4(int n) {
if(n==1||n==2) {
return 1;
}
return f4(n-1) + f4(n-2);
}
/**
* 需求 : 比較兩個字元串是否相等
*
* @param s1
* @param s2
* @return
*/
public static boolean f5(String s1, String s2) {
if(s1.length() != s2.length()) {
return false;
}
if(s1.length() == 0) {
return true;
}
if(s1.charAt(0) != s2.charAt(0)) {
return false;
}
return f5(s1.substring(1),s2.substring(1));
}
}
/*
輸出:
6
11
11
edcba
8
false
*/
其他遞歸例題