1.题目分析
题目1:将非负十进制整数n转换成b进制。(其中b=2~16)
题目2:任何一个正整数都可以用2的幂次方表示。例如:
137=27+23+2^0
同时约定幂次方用括号来表示,即ab 可表示为a(b)。
由此可知,137可表示为:
2(7)+2(3)+2(0)
进一步:7= 22+2+20 (21用2表示)
3=2+2^0
所以最后137可表示为:
2(2(2)+2+2(0))+2(2+2(0))+2(0)
2.算法设计思路
题目一:递归:由于每次执行的过程都比较有规律,所以可以设置成递归模型。先定义一个StringBuilder类型的变量,表示转化后的数。当n不为0时,采用取余的方法。如果余数大于9时,将数字转化成相应的字母符号,然后添加进StringBuilder的变量中。如果小于等于9时,直接添加进去,然后返回fun(n/b,b)。然后返回当n为0时,返回StringBuilder类型变量。
S n=0
fun(n,b)
fun(n/b,b) n>0
非递归:先设置一个ArrayList类的对象,用于存放转换后的进制数。采用whlie()循环,循环条件为n>0时,进入循环。然后m=n%b,n=n/b。然后把m存入集合中。循环结束后,然后通过for循环逆序输出集合元素。
题目二:递归:先传入一个参数n,由于所以的指数都最后被分解成1或2.所以递归结束的条件为当n为1或2。然后就是分解的过程,先设定一个i表示2的次数,m为刚好比n大的2的幂次方数。通过while()循环求出i,m的值然后若m/2==n,则输出“2()”,如果m/2=2,打印“2+”,否则输出“2()+”。
3.运行结果
题目1:
题目2
4.总结
递归的基本思想是把规模大的问题转化为规模小的相似的子问题来解决。在函数实现时,因为解决大问题的方法和解决小问题的方法往往是同一个方法,所以就产生了函数调用它自身的情况。另外这个解决问题的函数必须有明显的结束条件,这样就不会产生无限递归的情况了。
递归算法:
优点:代码简洁、清晰,并且容易验证正确性。
缺点:它的运行需要较多次数的函数调用,如果调用层数比较深,需要增加额外的堆栈处理,比如参数传递需要压栈等操作,会对执行效率有一定影响。但是,对于某些问题,如果不使用递归,那将是极端难看的代码。
循环算法:
优点:速度快,结构简单。
缺点:并不能解决所有的问题。有的问题适合使用递归而不是循环。如果使用循环并不困难的话,最好使用循环。
核心代码
public class jinzhi {//输入一个十进制数n,转换成任意b进制数
StringBuilder s=new StringBuilder();//存放进制转换后的数
public StringBuilder fun(int n,int b) {//递归实现
if(n0) {
s.reverse();//元素取反
return s;
}else {
int m=n%b;
if(m>9) {
int a=‘A’+m-10;
char c=(char) (a);
s.append©;
}else {
s.append(""+m);
}
return fun(n/b,b);
}
}
public void fun2(int n,int b) {//非递归实现
ArrayList a=new ArrayList();//存放转换后的集合
while(n!=0) {
int m=n%b;
if(m>9) {
String c=String.valueOf((char)((int)‘A’+m-10));
a.add©;
}else {
String s=String.valueOf(m);
a.add(s);
}
n/=b;
}
for(int i=a.size()-1;i>-1;i–) {//遍历并输出
System.out.print(a.get(i));
}
}
}
public class jinzhi2 {//将任意一个数字用2的幂次方表示
public void fun(int n) {//递归出口
if(n1) {
System.out.print(“2(0)”);
return ;
}
if(n2) {//递归出口
System.out.print(“2”);
return ;
}
int m=1;//刚好比n大的2的幂次方数
int i=-1;//2幂次方的指数
while(m<=n) {
m*=2;
i++;
}
if(nm/2) {//递归体
System.out.print(“2(”);
fun(i);
System.out.print(")");
}else {//递归体
if(m/2==2) {
System.out.print(“2”);
System.out.print("+");
fun(n-m/2);
}else {//递归体
System.out.print(“2(”);
fun(i);
System.out.print(")+");
fun(n-m/2);
}
}
}
}