Java 哪个递归更好?全局变量还是局部变量

Java 哪个递归更好?全局变量还是局部变量,java,recursion,Java,Recursion,我已经用Java编程很长一段时间了,但我一直远离递归。我最近发现递归在解决问题上非常灵巧,所以我开始练习它 我将范围缩小为两种方式: 1) 使用全局变量 2) 使用局部变量 我编写了一个简单的程序,将字符串转换为相应的Int值 private static int integerNumber; // <---global variable //****the global variable way**** public static void StringToInt(String s)

我已经用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));
    }
}

private static int integerNumber;// 就空间效率而言,从表面上看,第一种方法的空间效率稍高一些,因为第二种方法需要在每个调用级别使用额外的局部变量
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));
}

但是,一般来说,在递归方法本身之外使用任何状态(包括实例变量)时都应该非常小心,因为依赖于保持外部状态会使递归代码更难理解。

考虑在多线程环境中执行此操作时会发生什么情况。这将取决于如何使用它们。例如,您可以将结束结果存储在
列表中
,但对于当前解决方案(当前递归调用),您可以将数据存储在本地
列表中
。列表是递归的一个不好的示例。你知道开始和结束,循环没有区别。@OliCharlesworth-我没有多线程编程的经验。你能澄清一下吗。我想知道哪种方法占用的空间最少LuiggiMendoza@PeterRader在动态规划中,您需要保留以前操作的结果,在那里您可以使用
列表
映射
并在其中导航,以找到适合您具体情况的最佳解决方案。此外,可以使用递归方法实现查找解决方案的当前算法。我不认为有一个
列表
是递归的一个坏例子,可能没有广泛使用它。好吧……你是说我应该一直遵循递归的局部变量方法。有没有其他方法可以节省每台电脑的空间call@AneeshK就节省空间而言,最好的建议不是关于堆栈帧上的额外变量,而是关于所需的堆栈帧数量,即调用的最大深度。如果最大深度随数据结构的大小线性增长,则不应使用递归(除非它是尾部调用,并且您使用的是优化它的现代编译器)。当调用的深度增长为Log2(N)时,在堆栈中添加几个标量变量不会产生太大的影响。
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));
}