递归算法简单应用

递归:

程序调用自身的编程技巧称为递归。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。

    @Test
    public void test03(){
        int []arr=new int []{5,7,12,13,24,54,68};
        int a=binarySearch(arr,0,arr.length-1,54);
        System.out.println(a);
    }

    /**
     * 递归实现二分查找
     * binarySearch在arr数组中从i到j的范围中,用二分查找搜索val
     * @param arr
     * @param i
     * @param j
     * @param val
     * @return
     */
    private int binarySearch(int[]arr,int i,int j,int val) {
        if (i > j) {
            return -1;
        }
            int mid = (i + j) / 2;
            if (val < arr[mid]) {
                return binarySearch(arr, i, mid - 1, val);
            } else if (val > arr[mid]) {
                return binarySearch(arr, mid + 1, j, val);
            } else {
                return mid;
            }
        }

    class Entry{
        int data;
        Entry next;
        public Entry(int data, Entry next) {
            this.data = data;
            this.next = next;
        }
    }
    @Test
    public void test02(){
        Entry root = new Entry(0, null);
        Entry n1 = new Entry(10, null);
        Entry n2 = new Entry(10, null);
        Entry n3 = new Entry(10, null);
        Entry n4 = new Entry(10, null);
        root.next = n1;
        n1.next = n2;
        n2.next = n3;
        n3.next = n4;
        System.out.println("链表有效节点的数量:" + func4(root));
    }
    /**
     * 返回以root为根节点的单链表有效节点的数量,用递归实现
     * @param root
     * @return
     */
    private int func4(Entry root) {
        if (root==null){
            return 0;
        }else {
            return 1+func4(root.next);
        }
    }
    @Test
    public void test01(){
        /**
         * 实现一个递归函数func3,判断arr数组是否是一个递增序列的数组 true false
         */
        int [] arr=new int []{12,5,7,89,32,13};
       boolean a= func3(arr);
       System.out.println(a);

    }
    private boolean func3(int arr[]){
        return func3(arr,0,arr.length);
    }
        private boolean func3(int[] arr,int i,int j) {
        if (i+1>j){
            return true;
        }
        if (arr[i]>arr[i+1]){
                return false;
            }
            return func3(arr,i+1,j);
    }

    /**
     * 递归求斐波那契数字
     * @param n
     * @return
     */
    private int func2(int n){
        if(n==0||n==1){
            return 1;
        }else {
            return  func2(n-1)+func2(n-2);
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值