题目:将非负十进制整数n转换成b进制。(其中b=2~16)
一、算法构造
递归实现:1、先找递归出口,我们采用除进制倒取余的方法求进制转换,很明显递归出口就是当整数等于0时,当整数等于0时,递归结束,输出转换结果。
2、再找递归公式,发现每次递归循环时,只改变整数的值,每次整数的值都整除进制。所以递归公式为f(t,n/v,v)。t指的是输出的字符串,将每次得到的余数按照倒序的方式加起来,就能得到转换的结果。
非递归实现:使用while循环,将循环退出的条件设为n=0,其余和递归体基本一样。
二、递归模型和递归栈
1、递归模型:![在这里插入图片描述](https://img-blog.csdnimg.cn/20190609193346516.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzg2ODAyNQ==,size_16,color_FFFFFF,t_70
2、递归栈:
三、实现代码
import java.util.Scanner;
public class Transform {
public static void main(String[] args) {
Transform t=new Transform();
Scanner scan=new Scanner(System.in);
System.out.println("请输入一个非负整数:");
int x=scan.nextInt();
System.out.println("请输入进制:(2-16)");
int v=scan.nextInt();
System.out.println("递归:\n"+v+"进制:"+t.system1("", x, v));
System.out.println("非递归:\n"+v+"进制:"+t.system2(x, v));
}
String value(int n) {
if(n<10) {
return String.valueOf(n);
}else {
return String.valueOf((char)(n+55));
}
}
String system1(String t,int x,int v) {
if(x==0) {
return t;
}else {
return system1(value(x%v)+t ,x/v,v);
}
}
String system2(int x,int v) {
String t="";
while(x!=0) {
t=value(x%v)+t;
x=x/v;
}
return t;
}
}
四、总结
1、递归的关键就是寻找递归出口和递归公式,只要找到这两点,就能搭建出递归模型,
进行求解。
2、非递归和递归的转化,一种是迭代的方法,例如进制转换的题,就是这样转变成非递归的。用while循环来表达递归的迭代。还有就是将其利用和栈的关系,用出栈和入栈来转换。