一.求n的阶乘
1.找重复:n*(n-1)!,求(n-1)!是原问题的重复(规模更小)——子问题。
2.找变化:重复中变化的量应该作为参数。
3.找边界:递归的出口。
public class 求N的阶乘 {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(fun(3));
}
public static int fun(int n) {
if(n==1) {
return 1;
}
return n*fun(n-1);
}
}
二.打印i-j
public class 打印i到j {
public static void main(String[] args) {
// TODO Auto-generated method stub
fun(1,10);
}
//找重复:打印i+1到j是一个子问题
//找变化:重复中变化的量是i,所以i要作为参数
//找边界:出口就是i>j
public static void fun(int i,int j) {
if(i>j) {
return;
}
System.out.println(i);
fun(i+1,j);
}
}
三.对数组的所有元素求和
public class 对数组的所有元素求和 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int res = sum(new int[] {1,2,3,4,5},0);
System.out.println(res);
}
//找重复:假设这个数组的长度是n,子问题就是求后面n-1个元素的和
//找变化:这里重复中变化的变量是数组的起始位置
//找边界:数组的起始位置等于数组的最大下标了
public static int sum(int[] arr,int begin) {
if(begin==arr.length-1) {
return arr[begin];
}
return arr[begin]+sum(arr,begin+1);
}
}
四.字符串的翻转
public class 字符串的翻转 {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(reverse("abcd",3));
}
//找重复:"abcd"的翻转的子问题就是"abc"的翻转
//找变化:这里就是end的变化即要翻转的字符串的变化
//找边界:end等于0的时候即到达最后一个字符
public static String reverse(String str,int end) {
if(end == 0) {
return str.charAt(end)+"";
}
return str.charAt(end)+reverse(str,end-1);
}
}