一、题目分析
十进制整数转N进制整数:除N取余,逆序排列
具体做法:用N去除十进制整数,可以得到一个商和余数,再用N去除商,又会得到一个商和余数,如此进行,直到最后的商比N小时为止,将余数和最后的商从下向上倒序写就是结果。
二、算法设计
递归:
void translation(char *s,int value,int b){
int lengt;
char str[]={"0123456789ABCDEF"};
if(value==0){
strcpy(s,"");
return;
}
translation(s,value/b,b);
lengt= strlen(s);
s[lengt]=str[value%b];
s[lengt+1]='\0';
}
非递归:
int dec2eve(int dec, int jinZhi)
{
Stack s;
int temp, index = 0, i;
s.top = 0;
while (dec) {
temp = dec % jinZhi;
if (temp < 10) {
s.elements[s.top] = temp + '0';
index++;
s.top++;
}
else {
s.elements[s.top] = temp - 10 + 'A';
index++;
s.top++;
}
dec /= jinZhi;
}
三、递归栈
四、测试、调试截图
递归测试:
非递归测试:
五、经验总结
借助堆栈将递归转化为非递归有两种方法:
第一种方法:借助堆栈模拟递归的执行过程。这种方法几乎是通用的方法,因为递归本身就是通过堆栈实现的,我们只要把递归函数调用的局部变量和相应的状态放入到一个栈结构中,在函数调用和返回时做好push和pop操作,就可以了。
第二种方法:借助堆栈的循环结构算法。这种方法常常适用于某些局部变量有依赖关系,且需要重复执行的场景,例如二叉树的遍历算法,就采用的这种方法。