您的位置:首页 > 其它

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

2017-08-20 00:28 204 查看
用递归的方法找到从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
4000
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
= '\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;
}

};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: