递归算法

递归算法解决问题的特点:
(1) 递归就是在过程或函数里调用自身。
(2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。
(3) 递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。所以一般不提倡用递归算法设计程序。
(4) 在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。所以一般不提倡用递归算法设计程序。

例1:一列数的规则如下: 1、1、2、3、5、8、13、21、34...... 求第30位数是多少。

/*
 * @(#)Recrusion.java
 *
 * Copyright 2015Vision, Inc. All rights reserved.
 */

package test;

/**
 * description
 *
 * @author zhangkaishun
 * @version 1.0,2015-9-2
 */
public class Recrusion {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        System.out.println(Fool(4));
    }
    public static int Fool(int i) {
        if (i <= 0)
            return 0;
        else if (i > 0 && i <= 2)
            return 1;
        else
            return Fool(i - 1) + Fool(i - 2);
    }
}

用递归算法求某一个数的阶乘

/*
 * @(#)Recrusion1.java
 *
 * Copyright 2015Vision, Inc. All rights reserved.
 */

package test;

/**
 * 求某一个数的阶乘
 *
 * @author zhangkaishun
 * @version 1.0,2015-9-2
 */
public class Recrusion1 {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        System.out.println(multiply(5));
    }
    public static int multiply(int t) {
        if (t == 1)
            return 1;
        else
            return t * multiply(t - 1);
    }
}
结果为:120

java递归全排列问题

这只是一步

/*
 * @(#)Recrusion3.java
 *
 * Copyright 2015Vision, Inc. All rights reserved.
 */

package test;

/**
 * description
 *
 * @author zhangkaishun
 * @version 1.0,2015-9-2
 */
public class Recrusion3 {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        permute("abcd");
    }

    public static void permute(String str) {
        char[] strArray = str.toCharArray();
        permute(strArray, 0, strArray.length - 1);
    }

    public static void permute(char[] list, int low, int high) {
        int i;
        if (low == high) {
            String cout = "";
            for (i = 0; i <= high; i++) {
                cout += list[i];
            }
                System.out.println(cout);
            
        } else {
            for (i = low; i <= high; i++) {
                char temp = list[low];
                list[low] = list[i];
                list[i] = temp;
                permute(list, low + 1, high);
                temp = list[low];
                list[low] = list[i];
                list[i] = temp;
            }
        }
    }
}
结果:abcd
abdc
acbd
acdb
adcb
adbc
bacd
badc
bcad
bcda
bdca
bdac
cbad
cbda
cabd
cadb
cdab
cdba
dbca
dbac
dcba
dcab
dacb
dabc


如果有来生,要做一片树叶。 春天恋上枝,炎夏恋上水。 深秋恋上土,东来化作泥。 润物细无声,生生世世恋红尘。
原文地址:https://www.cnblogs.com/shujiying/p/4777865.html