一、题目
用递归的方法找到从1到最大的N位整数。
注意事项
用下面这种方式去递归其实很容易:
recursion(i) {
if i > largest number:
return
results.add(i)
recursion(i + 1)
}
但是这种方式会耗费很多的递归空间,导致堆栈溢出。你能够用其他的方式来递归使得递归的深度最多只有 N 层么?
二、分析和解答
1、我先尝试用最笨的方法写了一遍,代码如下:
List<Integer> search(int x,int max,List<Integer> res){
if(x < max){
res.add(x);
search(x+1,max,res);
return res;
}
return null;
}
public List<Integer> numbersByRecursion(int n) {
int max = (int)Math.pow(10,n);
List<Integer> res = new ArrayList();
return search(1,max,res);
}
当然,结果就是空间栈溢出了!不过这个最简单的思想还是要理解一下的。
有一点需要注意:”^”符号表示的是异或,而不是多少次幂!Math.pow(m,n)表示的是m的n次幂,且返回的结果是double类型的。
2、
List<Integer> search(int x,int max,List<Integer> res){
if(x == 1)
res.add(1);
else
search(x-1,max,res).add(x);
return res;
}
public List<Integer> numbersByRecursion(int n) {
// write your code here
if(n == 0)
return null;
int max = (int)Math.pow(10,n);
List<Integer> res = new ArrayList();
return search(max-1,max,res);
}
本来想用什么尾递归来做的,但其实我那样不是尾递归,没有任何改进。
尾递归就是指不需要返回的递归,里面就没有了压栈操作。
3、要求递归堆栈的深度为N层,那就第一层打印:1-9,第二层打印10-99,第三层打印100-999等等。代码如下:
public List<Integer> numbersByRecursion(int n) {
List<Integer> res = new ArrayList();
if(n == 0)//若为0,返回null
return null;
if(n == 1){//若为1,打印1-9
for(int i=1;i<10;i++)
res.add(i);
return res;
}else{//n>=2
res.addAll(numbersByRecursion(n-1));//先添加之前的
for(int i=(int)Math.pow(10,n-1);i<(int)Math.pow(10,n);i++)
res.add(i);
return res;
}
}