用递归打印数字

一、题目
用递归的方法找到从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;
        }

    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值