第6章 递归
题目1:将非负十进制整数n转换成b进制。(其中b=2~16
一.题目分析:
- 定义一个字符串函数fun。
- 递归头:当n小于等于0时,返回一个空字符串“”;
- 设yu为n/b的余数;
- 若yu数小于10,则返回 yu
- 若yu大于等于10,则返回(char)(‘A’+(yu-10));
- 递归体为fun(N/2,x),当n小于等于0时,返回“”,当上一个n,返回“yu”;
二.源程序:
public class Main {
public static void main(String[] args) {
Scanner sca=new Scanner(System.in);
System.out.println("请输入要转化的数字:");
int z=sca.nextInt();
System.out.println("请输入要转化的进制:");
int x=sca.nextInt();
System.out.println("转化的结果:");
System.out.println(fun(z, x));
sca.close();
}
public static String fun(int num ,int x) {
if(num==0) {
return "" ;
}
int yu = num % x;
if(yu>=10) {
return fun(num / x, x) + (char)('A'+(yu - 10));
} else {
return fun(num / x, x) + yu;
}
}
}
三.测试与调试:
题目2:任何一个正整数都可以用2的幂次方表示。例如:
137=2^7+2^3+2^0
同时约定幂次方用括号来表示,即ab 可表示为a(b)。
由此可知,137可表示为:
2(7)+2(3)+2(0)
进一步:7= 2^2+2+2^0 (21用2表示)
3=2+2^0
所以最后137可表示为:
2(2(2)+2+2(0))+2(2+2(0))+2(0)
又如:
1315=2^10 +2^8 +2^5 +2+2^0
所以1315最后可表示为:
2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)
输入:正整数(n≤20000)
输出:符合约定的n的0,2表示(在表示中不能有空格)
输入格式 Input Format
一个正整数
输出格式 Output Format
符合约定的n的0,2表示(在表示中不能有空格)
样例输入 Sample Input
73
样例输出 Sample Output
2(2(2)+2)+2(2+2(0))+2(0)
一.源程序:
package cn.test.wuyugege;
public class Main {
public static void main(String[] args) {
fun(73,0);
}
public static void fun(int m,int n)
//m为被分解的数,n为二进制位数,r为位数上的数值。
{
int r;
if(m==0)//m已经被分解完,返回
{
return;
}
r=m%2;
m=m/2;
fun(m,n+1);
if(m!=0&&r!=0)
//如果m不为0且r不为0证明这不是第一个2的幂次方,输出+
{
System.out.print("+");
}
if(r==1)
{
if(n==0)
{
System.out.print("2(0)");
}
else if(n==1)
{
System.out.print("2");
}
else if(n==2)
{
System.out.print("2(2)");
}
else
{
System.out.print("2(");
fun(n,0);
//如果指数不能用2(0),2,2(2)表示则继续分解
System.out.print(")");
}
}
}
}
二.调试:
三.心得体会:
- 经过本次作业,我对于递归算法的思想更加了解,。
- 不知道递归头和递归体该如何进行设计。
- 经过此次作业的锻炼,,我对于递归头,递归体有了更好的掌握。
- 当然,第二题刚开始还是有点难,但是借助https://blog.youkuaiyun.com/lydia_ke/article/details/78678792,找更好的解决办法。