递归
递归设计经验
—找重复(子问题)
—找重复中的变化量—>参数
—找参数的变化趋势—>设计出口
最基本递归
static void f(int i){
if(i==0) return;
f(i-1);//调用自身
}
1)问题分解为:直接量+小规模子问题
2)问题分解为:多个小规模子问题
一、切蛋糕思维
1.求阶乘
static void f1(int n){
if(n==1) return 1;
return n*f(n-1);
}
2.打印i—j
static void f21(int i,int j){
System.out.println(i);
if(i==j) return;
f2(i+1,j);
}
static void f22(int i,int j){
if(i>j) return;
System.out.println(i);
f2(i+1,j);
}
3.对arr的所有元素求和
static void f3(int[] arr,int i){
if(i == arr.length-1) return arr[i];
return arr[i]+f3(arr,i+1);
}
4.翻转字符串
static String f4(String s,int end){
if(end==0) return ""+s.charAt(0);
return s.charAt(end)+f4(s,end-1);
}
二、递推公式或等价转换
5.斐波拉契数列
static int f5(int n){
if(n==1||n==2) return 1;
return f(n-1)+f(n-2);
}
6.最大公倍数—辗转相除法
static int gcd(int m,int n){
if(n==0) return m;
return gcd(n,m%n);
}
7.插入排序-从小到大
思路:对数组n-1到第一个数这部分排序,将第n个数插入到已经有序的部分
static void insertSort(int[] arr,int k){
if(k==0) return;
insertSort(arr,k-1);
int x=arr[k];
int index=k-1;
while(index>-1&&x<arr[index]){
arr[index+1]=arr[index];
index--;
}
arr[index+1]=x;
}
8.二分查找的递归解法
static int binarySearch(int[] arr,int low,int high.int key){
if(low>high) return -1;
int mid=low+((high-low)>>1);
int midVal=arr[mid];
if(midVal<key) return binarySearch(arr,mid+1,high,key);
else if(midVal>key) return binarySearch(arr,low,mid-1,key);
else return mid;
}
如有侵权,立删。