第六章作业--递归

作者:A.y.

日期:2019/6/8

运行环境:eclipse

一、题目要求
题目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)
二、题目分析
题目1.
递归:
设置递归函数Exchange(a,b)将十进制数a转换为b进制数,函数返回值为b进制数的字符串形式,首先将递归出口设置为a0;再设置递归体,其中先设置一个字符容器sb,在其末尾添加递归字符串Exchange(a/b,b),根据a%b的不同值添加不同的字符,最后再将字符容器sb转换为字符串的返回值输出。
非递归:
设置函数Exchange(a,b)将十进制数a转换为b进制数,设置字符容器sb,在while()循环中根据a%b的不同值来向sb的首位置添加不同的字符,然后a=a/b进行下一次循环,循环结束条件为a
0;循环结束后将sb转换为字符串的返回值并输出。
题目2.
设置函数Exchange(a,b)来输出十进制数的二进制表示,参数a表示该十进制数,b表示二的次方数,设置递归出口为a0&&b<=2。若a!=0,递归调用函数Exchange(a/b,b),调用之后若a%b!=0,判断b的值,若b0,输出+2(0);若b1,输出+2;若b2,输出2(2);否则输出+2(,再递归调用函数Exchange(b,0),调用之后输出)。若a0,判断b的值,若b0,则输出2(0);若b1,则输出2;若b2,则输出2(2);否则输出2(,再递归调用Exchange(b,0),再输出)。

三、递归模型
题目1:
f(a/b,b):输出a%b     ,a!=0(递归体)f(a,b)=null                    ,a==0(递归出口)
题目2:
在这里插入图片描述
四、递归栈
在这里插入图片描述
五、运行代码
题目1:
递归

import java.util.*;

public class Exception01 {
	public static String Exchange(int a,int b) {    //十进制转换n进制函数
		String sample;   //sample用来表示转换的n进制数
		if(a==0)   //设置递归出口
		{
			sample="";
		}
		else
		{	
			StringBuffer sb = new StringBuffer();  //设置一个字符容器sb
			sb.append(Exchange(a/b,b));
			switch(a%b)
			{
			case 10:
				sb.insert(sb.length(),"A");
				break;
			case 11:
				sb.insert(sb.length(),"B");
				break;
			case 12:
				sb.insert(sb.length(),"C");
				break;
			case 13:
				sb.insert(sb.length(),"D");
				break;
			case 14:
				sb.insert(sb.length(),"E");
				break;
			case 15:
				sb.insert(sb.length(),"F");
				break;
			default:
			  sb.insert(sb.length(),a%b);
			  break;
			}
			sample=sb.toString();
		}
		return sample;
	}
	public static void main(String[] args) {
		int a,b;
		Scanner sc = new Scanner(System.in);
		System.out.print("输入转换的十进制数:");
		a = sc.nextInt();
		System.out.print("请输入转换的进制:");
		b = sc.nextInt();
		System.out.println("转换后的"+b+"进制数为:"+Exchange(a,b)+"("+b+")");
		sc.close();
	}

}

非递归

import java.util.Scanner;

public class Exception02 {
	public static String Exchange(int a,int b) {
		String sample;
		StringBuffer sb = new StringBuffer();
		while(a!=0) {
			switch(a%b)
			{
			case 10:
				sb.insert(0,"A");
				break;
			case 11:
				sb.insert(0,"B");
				break;
			case 12:
				sb.insert(0,"C");
				break;
			case 13:
				sb.insert(0,"D");
				break;
			case 14:
				sb.insert(0,"E");
				break;
			case 15:
				sb.insert(0,"F");
				break;
			default:
			  sb.insert(0,a%b);
			  break;
			}
			a=a/b;
			if(a==0) {
				sample="";
			}
		}
		sample=sb.toString();
		return sample;
	}
	public static void main(String[] args) {
		int a,b;
		Scanner sc = new Scanner(System.in);
		System.out.print("输入转换的十进制数:");
		a = sc.nextInt();
		System.out.print("请输入转换的进制:");
		b = sc.nextInt();
		System.out.println("转换后的"+b+"进制数为:"+Exchange(a,b)+"("+b+")");
		sc.close();
	}
}

题目2:

import java.util.*;

public class Exception01 {
	public static void Exchange(int a,int b) {
		if(a==1)
		{
		    switch(b) {
		      case 0:
			      System.out.print("2(0)");
			      break;
		      case 1:
			      System.out.print("2");
			      break;
		      case 2:
			      System.out.print("2(2)");
			      break;
		      default:
		    	  System.out.print("2(");
		    	  Exchange(b,0);
		    	  System.out.print(")");
		    	  break;
		    }
		    
		}
		else
		{
			Exchange(a/2,b+1);
			if(a%2==1)
				switch(b) {
				 case 0:
				      System.out.print("+2(0)");
				      break;
			      case 1:
				      System.out.print("+2");
				      break;
			      case 2:
				      System.out.print("+2(2)");
				      break;
			      default:
			    	  System.out.print("+2(");
			    	  Exchange(b,0);
			    	  System.out.print(")");
			    	  break;
				}
		}
		
 	}
	public static void main(String[] args) {
		int number;
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入一个自然数:");
		number = sc.nextInt();
		Exchange(number,0);
		sc.close();
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值