0.简介
昨晚思考问题的时候,应该是想了好多问题,所以才有了这么个想法,给递归思想做个简单总结吧。
1.进制转换
这里就带着问题一起分析递归思想。首先,进制转换怎么做,10进制转换到2,8,16进制,先从最简单的问题思考,12345,这个数是一个10进制数,将其从10进制转换到10进制,听起来挺奇怪的,这也是分析问题的方法。步骤如下。
1. 12345,首先对10求余数,得到5,然后再除以10取整得到1234
2. 1234 对10取余数,得到4,......
3. 123... 3
4. 12... 2
5. 1... 1
上面的过程下来,我们得到的是54321,这个是反着来的,要是正过来就对了。
观察上面5个步骤,我们会不会发现一个共性?答案是会的,每个步骤都是一个数n对10求余数,然后除以10,在用下一个结果m继续重复这种操作,也就是我们可以写一个函数来实现这个简单的操作。
string toBase(int number, int base)
{
int n = number % base;
int m = number / base;
return "";
}
上面这段代码就是描述每个操作,取余后除以10,这个整个流程是循环下去的,也就是1步骤结束了就是2步骤,2然后是3,然后每个步骤的过程是一样的,就是输入的参数不同,也就是每个步骤的n是不同的,1步骤结束后,用1步骤的结果再去调用1流程。那么代码就是如下。
string toBase(int number, int base)
{
//操作步骤
int n = number % base;
int m = number / base;
//调用操作步骤
toBase(m, base);
return "";
}
上面代码就是一个流程结束后,用新的结果再去调用这个流程。此时,我们流程中的结果需要保存。
string toBase(int number, int base)
{
//操作步骤
int n = number % base;
int m = number / base;
//调用操作步骤
return toBase(m, base)+(char)(n + '0');
}
上面的代码乍一看不好理解,看下图的分析。
将实际数据带入其中试验一下。
这样一来,就形成了一个结果。
代码如下,我做了一个简化
string toBase(int number, int base)
{
return number==0 ? "" : toBase(number / base, base)+(char)(number % base + '0');
}
int main()
{
cout << toBase(9,2) << endl;
return 0;
}
其中f(0)是特殊情况,也是终止情况,f(0)的时候返回空串。中间的结果都在toBase调用的时候展开。
现在有一个问题,就是当要转换16进制的时候怎么办,所以要做一些修改,判断一下,如果是16进制的时候就处理一下返回ABCD这样的字母。
char numToNum(int n)
{
return n >= 10 ? (char)(n - 10 + 'A') :(char)(n + '0');
}
string toBase(int number, int base)
{
return number==0 ? "" : toBase(number / base, base)+ numToNum(number % base);
}
int main()
{
cout << toBase(123,16) << endl;
return 0;
}
这里就简单考虑了,大于10 的进制只有16进制。