递归和二分法求解例题实战

7 篇文章 0 订阅
3 篇文章 0 订阅

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


递归例题

1.爬楼问题

/**
     * 每次步长为1或者为2 或者为3 爬n阶楼梯 共有多少种方式
     */
    public static int  Func(int n ){
        //没有楼梯只有一种方式
        if (n==0){
            return 1;
        }
        if (n==1){
            return 1;
        }
        if (n== 2 ){
            return 2;
        }
        // 从后往前分析 让还差1步 差2步 差3步 的方式之和相加
        return Func(n-1)+Func(n-2)+Func(n-3);
    }

2.求a的n次幂

  public static int powFunc1(int a, int n){
        //保存结果
        int res=1;
        if (n==0){
            return 1;
        }
        // 遍历相乘n次
        for (int i = 0; i < n; i++) {
            res=res*a;
        }
        return res;
    }

二分法例题

       // 二分法模板
        /**
         * int begin=0
         * int end =a.length-1最后一个
         * while(begin+1<end){
         * mid = begin+ ((end-begin)>>1)
         *  if(条件)
         *  {
         *      判断在左边 end =mid-1
         *  }
         *  if()
         *  {
         *      判断在右边 begin=mid+1
         *  }
         * }
         */

1.旋转数组找最小值

 /**
     * 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个
     * 旋转,输入旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转吗,该数组的
     * 的最小值为1
     */
    /**
     * 有序数组 
     * @param a
     * @return
     */
     
    public static int findMin(int []a)  {
        int begin,end,mid;
        begin=0;
        end=a.length-1;

        if(a[begin]<a[end]){
            return a[begin];
        }
        while(begin+1<end){
            mid=begin+((end-begin)>>1);
            if(a[begin]<=a[mid]){
                begin=mid;
            }
            else {
                end=mid;
            }
        }
        return a[end];
    }

经过分析,最小值总是挨着最大值,并且最小值总是在无序的一边

2.排序后的字符数组找指定字符串的索引

/**
     * 有个排序后的字符串数组,其中散布着一些空字符串,
     * 编写一个方法,找出给定字符串(肯定不是空字符串)的索引。
     *
     */
    public static int findIndex(String [] strings,String str){
        int begin = 0;
        int end = strings.length-1;
        // 二分条件
        while (begin<=end){
            // 找到中点
            int midIndex= begin+((end-begin)>>1);
            //如果中点值是空串则右移
            while (strings[midIndex].equals("")){
                midIndex++;
                //找不到退出
                if (midIndex>end){
                    return -1;
                }
            }
            //判断在左边
            if (strings[midIndex].compareTo(str)>0){
                end=midIndex-1;
            }else if (strings[midIndex].compareTo(str)<0){
                begin=midIndex+1;
            }else {
                //相等则返回
                return midIndex;
            }
        }
        return -1;
    }

3.二分法加递归求解a的n次幂

 /**
     * 二分递归求解
     * @param a
     * @param n
     * @return
     */
    public static int powFunc(int a,int n){
        // 递归出口
        if(n==0){
            return 1;
        }
        //
        int res=a;
        // 记录已经求解的幂的次数
        int ex=1;
        // 判断是否能够翻倍
        while (ex<<1<n){
            // 能翻倍
            res=res*res;
            //指数减半
            ex=ex<<1;
        }
        // 递归求 剩下的n-ex次mi
        return res*powFunc(a,n-ex);
    }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhen-yu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值