第二章--查找与排序

China☆狼群 提交于 2020-02-05 15:03:18

递归

  • 找重复(重复子问题,问题的规模要越来越小)
  • 找变化(递归的核心是参数的变化)
  • 找边界(程序的出口)

递归可以理解为,我自己做一部分工作,剩下的交给下属去做,下属亦如此。

例题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));
	}
}

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!