我已经用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));
}
哪种方法节省空间,为什么?
答案 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));
}
但是,一般情况下,应该非常小心地使用递归方法本身之外的任何状态,包括实例变量,因为依赖于保持外部状态会使您的递归代码更难理解。