打印1到最大的n位数(递归实现)

上一篇博客是用循环实现的,代码比较繁琐,下面用递归实现:

具体思路:

由于n位数每一位都是由0到9组成的,所以通过全排列可以实现打印所有的数,

printnumber函数:判断递归是否到达最后一位,是则说明最后一位已经被赋值,打印number即可,否则继续递归赋值给下一位(从0到9开始)

具体代码如下:

//第二种方法实现(使用递归)
void printtomax2(int n)
{
    try
    {
        if(n<=0)
            throw exception("参数不合法");
        char *number=new char[n+1];
        number[n]='';
        printnumber(number,n,-1);//调用递归方法
    }
    catch(exception e)
    {
        cerr<<e.what()<<endl;
    }
}
void printnumber(char *number,int n,int index)
{
    //判断最后一位数字是否已经赋值,是则打印
    if(index==n-1)
    {
        Print(number);
        return;
    }
    //否则递归赋值,直到到达最后一位
    else
    {
        //从下一位开始,0-9依次赋值
        for(int i=0;i<10;i++)
        {
            number[index+1]='0'+i;
            
            printnumber(number,n,index+1);
        }
    }
}

Print函数:

//打印number中存的数字
void Print(char * number)
{
    bool beginprint=false;//区分是前面的0还是数字中的0,为true的话就一直打印下去
    int length=strlen(number);
    for(int i=0;i<length;i++)
    {
        if(number[i]!='0'&&(beginprint==false))//如果遇到第一个非0数则设置beginprint为true,开始打印
            beginprint=true;
        if(beginprint)
            cout<<number[i];
    }
    cout<<"   ";
}

测试函数以及运行结果:

int main()
{
    printtomax2(2);
    return 0;
}

原文地址:https://www.cnblogs.com/runninglzw/p/4509735.html