哪个递归更好?全局变量或局部变量

时间:2014-08-04 19:45:40

标签: java recursion

我已经用Java编程了很长一段时间,但我总是远离递归。我最近发现递归在解决问题时非常好,所以我开始练习它。

我把它缩小到两种方式:

1)使用全局变量

2)使用局部变量

我编写了一个简单的程序,将字符串转换为其各自的Int值

private static int integerNumber; // <---global variable

//****the global variable way****

public static void StringToInt(String s) {

    if (s.length()==1) {
        System.out.println("The integer number is ="+(integerNumber+Character.getNumericValue(s.charAt(0))));
        integerNumber=integerNumber+Character.getNumericValue(s.charAt(0));
    } else {
        integerNumber+=(Character.getNumericValue(s.charAt(0))*(int)Math.pow(10, s.length()-1));
        StringToInt(s.substring(1));
    }
}

以下是局部变量方式:

public static int StringToInteger(String s) { // ****local variable way****
    int intNum=0;// <--- local variable
    if (s.length()==1){
        intNum=Character.getNumericValue(s.charAt(0));
        return intNum;
    }else{
        return intNum=(int) (Math.pow(10,s.length()-1)*Character.getNumericValue(s.charAt(0)))+StringToInteger(s.substring(1));
    }

哪种方法节省空间,为什么?

1 个答案:

答案 0 :(得分:1)

就空间效率而言,从表面上看,第一种方式的空间效率稍高,因为第二种方式在每个调用级别都需要额外的局部变量intNum

但是,由于intNum的赋值恰好在返回之前发生,因此Java编译器可以完全自由地优化它:您的代码等同于:

if (s.length()==1){
    return Character.getNumericValue(s.charAt(0));
}else{
    return (int) (Math.pow(10,s.length()-1)*Character.getNumericValue(s.charAt(0)))+StringToInteger(s.substring(1));
}

但是,一般情况下,应该非常小心地使用递归方法本身之外的任何状态,包括实例变量,因为依赖于保持外部状态会使您的递归代码更难理解。