一:题目要求
将非负十进制整数n转换成b进制。(其中b=2~16)
1采用递归思想编程解决问题,要求设计出递归模型(递归出口和递归体的函数式)。
2程序设计风格良好,实现功能测试代码,确保程序的健壮性。
3画出递归树或者递归栈的调用过程。
4实现非递归方法。
二:设计思路和递归栈
1 递归方法
递归出口 if(n<b);
递归公式 当n>b时,recursion(n/b,n);
2 非递归方法
运用while循环,当n=0时跳出循环否则进行运算。
递归栈:
以6的二进制为例
递归的层次 |
递归栈的状态(n的值) |
说明 |
1 |
recursion(6) |
第一次递归入栈 |
2 |
recursion(3) recursion(6) |
由第一层进入第二层 第二次递归,入栈 |
3 |
recursion(1) recursion(3) recursion(6) |
由第二层进入第三层 第三次递归,入栈 |
4 |
recursion(0) recursion(1) recursion(3) recursion(6) |
由第三层进入第四次递归,进入第四次递归,入栈 |
5 |
recursion(1) recursion(3) recursion(6) |
得recursion(0)的值,出栈 |
6 |
recursion(3) recursion(6) |
得recursion(1)的值,出栈 |
7 |
recursion(6) |
得recursion(3)的值,出栈 |
8 |
栈空 |
得recursion(6)的值,出栈 |
package jinzhi;
import java.util.*;class calculate{
String a="";
//递归方法
void recursion(int n,int b) {
String s=String.valueOf(n%b); //将int型转换为string型
switch(s) {
case"10":
s="A";break;
case"11":
s="B";break;
case"12":
s="C";break;
case"13":
s="D";break;
case"14":
s="E";break;
case"15":
s="F";break;
}
if(n<b) {
a=s+a;
System.out.println("转换为"+b+"进制为:"+a);
}
else {
a=s+a;
recursion(n/b,b);
}
}
String c="";
//非递归方法
void nonrecursion(int n,int b){
while(n!=0) {
String s=String.valueOf(n%b);
switch(s) {
case"10":
s="A";break;
case"11":
s="B";break;
case"12":
s="C";break;
case"13":
s="D";break;
case"14":
s="E";break;
case"15":
s="F";break;
}
c=s+c;
n=n/b;
}
System.out.println("转换为"+b+"进制为:"+c);
}
}
public class shuzhi {
public static void main(String[] args) {
calculate A=new calculate();
Scanner in=new Scanner(System.in);
System.out.println("请输入十进制数:");
int n=in.nextInt();
System.out.println("请输入要转换的进制:");
int b=in.nextInt();
while(b<2||b>16) {
System.out.print("输入错误,请输正确进制(2-16):");
b=in.nextInt();
}
System.out.println("递归方法:");
A.recursion(n,b);
System.out.println("非递归方法:");
A.nonrecursion(n,b);
in.close(); //关闭输入流 释放内存
}
}