[LintCode]371.用递归打印数字

来源:互联网 发布:攻破网站数据库 编辑:程序博客网 时间:2024/06/05 13:02

用递归的方法找到从1到最大的N位整数。

注意事项

用下面这种方式去递归其实很容易:

recursion(i) {    if i > largest number:        return    results.add(i)    recursion(i + 1)}

但是这种方式会耗费很多的递归空间,导致堆栈溢出。你能够用其他的方式来递归使得递归的深度最多只有 N 层么?

样例

给出 N = 1, 返回[1,2,3,4,5,6,7,8,9].

给出 N = 2, 返回[1,2,3,4,5,6,7,8,9,10,11,...,99].


第一种:用字符串模拟数字
class Solution {public:    /**     * @param n: An integer.     * return : An array storing 1 to the largest number with n digits.     */    vector<int> numbersByRecursion(int n) {        vector<int> numarr;        if(n == 0){            return numarr;        }        char * number = new char[n+1];        //bool flag = false;        number[n] = '\0';        for(int i = 0; i< 10; i++){            number[0] = i + '0';            recursion(numarr,number,n,0);        }        delete [] number;//new 完后要记得释放内存        return numarr;         }        void recursion(vector<int> &numarr,char * num,int length ,int index){//这里之前写的是 vector<int numarr>,//如果是这样的话并没有把调用它的主函数中的numarr传进来,所以输出结果为[]       if(index == length-1){            int num1 = atoi(num);            if(num1 != 0)            {                numarr.push_back(num1);            }            return;        }        for(int i = 0; i< 10; i++){            num[index+1] = i+'0';            recursion(numarr,num,length, index+1);        }        return;//这里之前忘记写return了,这个是计算完第i位(i+1位后面的也计算完返回了,如果不加return,直接停在这一层,所以不会继续返回到第i-1位的计算当中)    }    };

第二种递归的深度最多只有N层,说明每一位是一次递归,其实也就是先把i-1层的都算出来,再计算第i层的就行

class Solution {public:    /**     * @param n: An integer.     * return : An array storing 1 to the largest number with n digits.     */    vector<int> numbersByRecursion(int n) {                vector<int> ret;          if(n<=0)              return ret;          else if(n==1)          {              ret = {1,2,3,4,5,6,7,8,9};              return ret;          }          else          {              vector<int> temp = numbersByRecursion(n-1);              copy(temp.begin(),temp.end(),back_inserter(ret));              for(int i=1;i<=9;i++)              {                  ret.push_back(pow(10,n-1)*i);                  for(auto x:temp)                  {                      ret.push_back(pow(10,n-1)*i+x);                  }              }              return ret;          }            }};

第三种做法类似于打印全排列,走一遍全排列的枚举树,从最高位开始一位一位地遍历,直到最低位形成一个数字,每一位都有0~9(十叉树)

class Solution {public:    /**     * @param n: An integer.     * return : An array storing 1 to the largest number with n digits.     */    vector<int> numbersByRecursion(int n) {       if(n<=0)              return vector<int>();          if(1==n)              return {1,2,3,4,5,6,7,8,9};          vector<int> ret;                                //当前层的结果          vector<int> tmp=numbersByRecursion(n-1);        //取用上一层的结果          copy(tmp.begin(),tmp.end(),back_inserter(ret)); //放进当前层中          for(int i=1;i<=9;++i){                          //计算当前层的所有值              int base=pow(10,n-1)*i;              ret.push_back(base);              for(auto &e:tmp)                            //借用了上一层的结果                  ret.push_back(base+e);          }          return ret;     }};


第四种

class Solution {public:    /**     * @param n: An integer.     * return : An array storing 1 to the largest number with n digits.     */    vector<int> numbersByRecursion(int n) {        if (n <= 0)             return vector<int>();                vector<int> nums;        dfs(nums, n, 0);        return nums;    }    void dfs(vector<int>& nums, int n, int cur) {        // n: 还剩下几位, cur: 当前数值        if (n == 0) {            if (cur > 0) nums.push_back(cur);            return;        }                for (int i = 0; i < 10; ++i) {            dfs(nums, n - 1, cur * 10 + i);        }    }};

第五种递归使得递归的深度最多为N。将1-10定为一层,10-100定为一层,那么输入n,最多就循环n层。

class Solution {public:    /**     * @param n: An integer.     * return : An array storing 1 to the largest number with n digits.     */    vector<int> ret;  //存放数据      vector<int> numbersByRecursion(int n) {                if( n<1 ){              return ret;          }          return print(1,n);   //打印从1开始的n位数      }        vector<int> print(int i, int n){          if( n>=1 ){ //依次将1-9,10-99,100-999放入容器内              int max = i*10;              for(int j=i; j<max; j++){                  ret.push_back(j);              }              print(max, n-1);          }          return ret;      }      };