递归 基本思想:自己调用自己
递归结构包括两个部分:1.定义递归头 即什么时候不调用自身方法 如果没有头,将进入死循环,也就是递归的结束条件
2.递归体 即什么时候需要调用自身方法
练习1:
/**
* 用递归解决下面描述的问题:
* 有三种面值的硬币,分别是1分,2分,5分,
* 现在给出一个价值,例如价值11,问组成该价值最少需要的硬币数量是多少???
* 11 = 1 10
* 11 = 2 9
* 11 = 5 6
*/
public class Coin { public static int lessCoin(int i){ if(i==1||i==2||i==5){ //如果是一角、两角、五角的直接返回一个数量 return 1; }else if(i<5){ //3角和4角都返回2个数量 return 2; }else{ return Math.min(1+lessCoin(i-1),Math.min(1+lessCoin(i-2), 1+lessCoin(i-5))); //若大于5,则应该返回三个中的最小数量 } } public static void main(String[] args) { System.out.println(lessCoin(12)); System.out.println(lessCoin(13)); } }
练习2:汉诺塔
private static void hanoi(int i, char a, char b, char c) { if(i==1){ System.out.println(a+"->"+c); }else{ hanoi(i-1, a, c, b); System.out.println(a + "->" + c); hanoi(i-1, b, a, c); } }
递归的分析:
练习3:
/**
* 用递归判断一个数组是否是递增序列的数组
* 思路:依次判断,从第一个开始,判断下一个是否大于当前的值
*/
int[] arr=new int[5];
Random rd=new Random();
for (int i = 0; i < arr.length; i++) {
arr[i]=rd.nextInt(10);
}
System.out.println(Arrays.toString(arr));
System.out.println(fun2(arr));
public static boolean fun2(int[] arr) { return fun2(arr,0); } public static boolean fun2(int arr[],int i){ if(i==arr.length-1){ return true; } if(arr[i]>arr[i+1]){ return false; } return fun2(arr,i+1); }