递归算法

简介

程序调用自身的编程技巧称为递归(recursion),直白的说就是自己调用自己,一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。

递归的三个条件:

边界条件
递归前进段
递归返回段
当边界条件不满足时,递归前进;当边界条件满足时,递归返回。

下面通过几个示例程序来说明:

使用Java代码求6的阶乘。

 /**
     * 计算6的乘积 6*5*4*3*2*1
     *
     * @param i
     * @return
     */
    public static int b(int i) {
        // 1.边界条件 当i=1的时候,返回1
        if (i == 1) {
            return 1;
        }
        //2.前进条件 当i!=1的时候,继续调用自身
        //3.从最大开始乘,如果当前参数为5,则5*4,当前参数为4,则4*3 即 i*b(i-1)
        return i * b(i - 1);
    }

结果:720

Java代码求数列:1,1,2,3,5,8......第40位的数

   /**
     * 1,1,2,3,5,8......第40位的数
     *
     * @param i
     * @return
     */
    public static int f(int i) {
        // 1.边界条件 i==1和i==2的时候返回1
        if (i <= 2) {
            return 1;
        }
        // 2.前进条件 i>2 的时候 继续调用自身
        // 3.当位数等于3时:2=1+1 位数等于4时 3=1+2 位数等于5时 5=2+3 位数等于6时 8=3+5 以此类推 i=f(i-2)+f(i-1)
        return f(i - 2) + f(i - 1);
    }

结果:102334155

从1到100相加 1+2+3+4+5+6+7+8+9+10.....+100

  /**
     * 从1到100相加 1+2+3+4+5+6+7+8+9+10.....+100
     *
     * @param i
     * @return
     */
    public static int a(int i) {
        // 边界条件
        if (i == 1) {
            return 1;
        }
        // 前进条件 如果i!=1 调用自身
        // 倒着来 100+(100-1) 99+(99-1) 则 i+a(i-1)
        return i + a(i - 1);
    }

结果:5050

结束语

初学者可能认为递归即是自己调用自己,那岂不是死循环了。对,如果递归写的不合理,那就是死循环了。但是如果写的合理,加上“边界条件”,程序执行到底的时候,会逐层返回。

你可能感兴趣的:(递归算法)