递归

递归   基本思想:自己调用自己

递归结构包括两个部分: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); }

 

 

posted @ 2019-10-09 16:15  acehm  阅读(168)  评论(0)    收藏  举报