递归
- 找重复(重复子问题,问题的规模要越来越小)
- 找变化(递归的核心是参数的变化)
- 找边界(程序的出口)
递归可以理解为,我自己做一部分工作,剩下的交给下属去做,下属亦如此。
例题1:反转字符串
像这种题就是切蛋糕思维,每次切一刀,使蛋糕越来越小
public class Main {
public static String reverse(String str, int end) {//end:尾字符下标
if(end == 0) return String.valueOf(str.charAt(0));
return str.charAt(end) + reverse(str, end - 1);
}
public static void main(String[] args) {
String res = reverse("12345", 4);
System.out.println(res);
}
}
例题2:求最大公约数
这种数学题没法用切蛋糕的思维,需要找出递推公式 。
求 m, n 的最大公约数
如果 m % n = 0,说明 m 是 n 的整数倍,最大公约数就是 n。
如果 m % n = k,k 不为零,则用 n % k , 若 n % k = 0,说明 k 是最大公约数,若 n % k = p,p不为零,则更新 n = k, k = p。
public class Main {
public static int recurse(int m ,int n) {
if(m % n == 0) return n;
return recurse(n, m % n);
}
public static void main(String[] args) {
System.out.println(recurse(12,8));
}
}
例题3:递归形式的插入排序
找等价关系
对数组排序等价于:对数组的第一个到倒数第二个元素排序,然后把最后一个元素加入到这个有序数组中。
import java.util.Arrays;
public class Main {
public static void insertSort(int[] arr, int end) {
if(end == 0) return ;
//对前 end - 1 个元素排序
insertSort(arr, end - 1);
//把 end索引处的元素插入前面的部分
int num = arr[end];
int index = end - 1;
while(num < arr[index]) {
arr[index + 1] = arr[index];
index--;//index = 0时,index--变为-1,会进入下一次循环,有数组越界的风险
if(index < 0) break;
}
arr[index + 1] = num;
}
public static void main(String[] args) {
int[] arr = {1,3,4,2,0,9};
insertSort(arr,arr.length - 1);
System.out.println(Arrays.toString(arr));
}
}
来源:CSDN
作者:码畜也有梦想
链接:https://blog.csdn.net/QinLaoDeMaChu/article/details/104181269