程序设计方法与优化第十一次作业

第6章 递归
一、算法设计思路:
1、基本要求:
递归方法:
10进制转换为2进制的方法是将一个数(记为n)除二,记录所得余数,然后令n=n/2,将n再除二,记录所得余数,一直循环下去,直到n的值为零,最后倒序输出所有余数即为结果。因此这里可以模仿该方法进行递归函数设计。只要将二进制修改为想要输出的进制即可。
递归模型:
在这里插入图片描述
源码:
package package1;
import java.util.;
public class Test {
public static char[] array=new char[8];//定义数组保存转换后的进制数
public static int k=0;//数组的下标变量
public static void Change(int n,int b){//递归函数,参数n为要转换的数,b为要转换的进制数
if(n!=0){//n不为零继续递归
array[k]= (char)(n%b);//数组保存n%b的值
k++;//数组 下标变量加一
n/=b;//将n/b的值赋予n
Change(n,b);//递归调用自身
}
else{//若n为零进行输出
for(int i=array.length-1;i>=0;i–){//通过循环进行输出
if((int)array[i]==10){
System.out.println(‘A’);
}
else if((int)array[i]==11){
System.out.println(‘B’);
}
else if((int)array[i]==12){
System.out.println(‘C’);
}
else if((int)array[i]==13){
System.out.println(‘D’);
}
else if((int)array[i]==14){
System.out.println(‘E’);
}
else if((int)array[i]==15){
System.out.println(‘F’);
}
else
System.out.println((int)array[i]);
}
}
}
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.println(“请输入一个十进制整数:”);
int n=sc.nextInt();
System.out.println(“请输入要转换的进制数(2至16)”);
int b=sc.nextInt();
Change(n,b);
sc.close();
}
}
非递归方法:
package package1;
import java.util.
;
public class Test2 {
public static char[] array=new char[8];
public static int k=0;
public static void Change(int n,int b){
while(n!=0){//使用While循环运算并保存值到数组中
array[k]= (char)(n%b);
k++;
n/=b;
}
for(int i=array.length-1;i>=0;i–){//for循环输出结果
if((int)array[i]==10){
System.out.println(‘A’);
}
else if((int)array[i]==11){
System.out.println(‘B’);
}
else if((int)array[i]==12){
System.out.println(‘C’);
}
else if((int)array[i]==13){
System.out.println(‘D’);
}
else if((int)array[i]==14){
System.out.println(‘E’);
}
else if((int)array[i]==15){
System.out.println(‘F’);
}
else
System.out.println((int)array[i]);
}
}
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.println(“请输入一个十进制整数:”);
int n=sc.nextInt();
System.out.println(“请输入要转换的进制数(2至16)”);
int b=sc.nextInt();
Change(n,b);
sc.close();
}
}
提高要求:
该递归函数采用边运算边输出的方法进行设计,观察输出实例可知最终输出的为2(0)或2,这就是递归函数的出口,假设要转换的数为n,利用循环求出大于n且最接近n的2次幂,设这个2次幂为j,设这个2次幂的指数为k,先将k的值减一,若n等于j/2,先输出2(,再将指数k作为参数进行递归调用,再输出),若n大于j/2,先输出2(,再将指数k作为参数进行递归调用,再输出)+,最后再将n-j/2作为递归调用的参数进行递归。
递归模型:

在这里插入图片描述
源码:
package package1;
import java.util.;
public class Test2 {
public static void put(int n)
{
if(n1)//n等于1时
{
System.out.print(“2(0)”);//输出2(0)
return;//退出函数
}
if(n
2)//n等于2时
{
System.out.print(“2”);//输出2
return;//退出函数
}
int j=1;
int k=0;
//利用循环求出大于n且最接近n的2的幂次数
while(j<=n)
{
j=j
2;
k++;
}
k=k-1;//指数值减一,k保存小于n且最接近n的2的幂次方的指数
if(nj/2)//如果n能化为2的幂次方
{
System.out.print(“2(”);//输出2(
put(k);//递归调用,对指数进行分解
System.out.print(")");//输出)
}
//n不能化为2的幂次方
else
{
if(j/2
2)//若j的值为4,也即n的值为3
{
System.out.print(“2”);//输出2
System.out.print("+");//输出+
put(n-j/2);//将n-j/2的值作为递归函数调用的参数,也即将1作为参数
}
//j的值不为4
else
{
System.out.print(“2(”);//输出2)
put(k);//将指数k作为递归调用的参数
System.out.print(")+");//输出)+
put(n-j/2);//将n-j/2作为递归调用的参数,也即继续分解下一个2的幂次方
}
}
}
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n;
System.out.println(“请输入一个小于20000的整数:”);
n=sc.nextInt();
put(n);
sc.close();
}
}

二、调试及测试截屏
基本要求:
递归方法:
在这里插入图片描述
非递归方法:
在这里插入图片描述
提高要求:
在这里插入图片描述
三、总结:
递归是程序直接或间接调用自身的过程,递归是程序设计中最有力的工具之一,使用递归能解决诸多经典的问题,经过本次设计,我加深了对递归的理解,增强了递归的设计能力。使用好递归,既能省时又能省力,因此学好递归非常重要。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值