递归程序(二,包含进制转换与2的幂次方表示)

第一题:将非负十进制整数n转换成b进制。(其中b=2~16)

递归:
这个题其实就是对于数据n,要将其转换为b进制的数,即是除b取余法,对于每次取余之后得到的数据,对于转换后大于十进制的数,进行特殊处理,用AF对应于1015;最后按相反的顺序输出即可;而在此题中,使用递归方法时,是先递归调用函数,在将相应的字符加入StringBuffer变量s1中即可,恰好利用递归栈,先进后出的特点,直接输出串即为所求数据转换后的进制数的字符串形式。
递归出口:

if(n==0)
		{
			return;
		}

递归体:

	if(n>0)
		{
			
			f1(n/b,b);
			if(n%b<10)
			{
				s1.append(n%b);
			}
			else
			{
				int c=n%b;
				switch(c)
				{
					case 10:
						s1.append("A");
						break;
					case 11:
						s1.append("B");
						break;
					case 12:
						s1.append("C");
						break;
					case 13:
						s1.append("D");
						break;
					case 14:
						s1.append("E");
						break;
					case 15:
						s1.append("F");
						break;
					default:
						break;
						
				}
			}
		}

非递归:即在循环中一直除n取余法即可。

static StringBuffer s2=new StringBuffer();
	//非递归
	public static void f2(int n,int b)
	{
		while(n>0)
		{
			if(n%b<10)
			{
				s2.append(n%b);
			}
			else
			{
				int c=n%b;
				switch(c)
				{
					case 10:
						s2.append("A");
						break;
					case 11:
						s2.append("B");
						break;
					case 12:
						s2.append("C");
						break;
					case 13:
						s2.append("D");
						break;
					case 14:
						s2.append("E");
						break;
					case 15:
						s2.append("F");
						break;
					default:
						break;
						
				}
			}
			
			n/=b;
		}
	}

最后得到的是一个StringBuffer变量s2,最后将其翻转字符串即可得到答案;
第二题:
*

任何一个正整数都可以用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)
   又如:
     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)

这个题,现将n为1,2,3的三种特殊情况特殊处理,其他情况再特殊处理,首先找到对于2的t次方最接近n的数字t和对应的2的t次方的值sum;

while(sum<=n)
		{
			sum*=2;
			t++;
		}
		//找到对于n来说最大的幂次数t和幂次数对应的值sum
		sum/=2;
		t--;

接下来分两种情况处理:
1.对于sum刚好与n相等的情况,即是刚好是2的次幂数等于n的情况,

if(sum==n)//刚好是2的t次幂等于n的情况
		{
			System.out.print("2(");
			f(t);
			System.out.print(")");
		}

2.对于其他情况,即要使用加号了,在处理完最大次幂数之后,再递归处理剩下部分:即f(n-sum);

else//其他情况,就要带上加号了
		{
				
				System.out.print("2(");
				f(t);
				System.out.print(")+");
				f(n-sum);
		}

递归出口:

if(n==1)
		{
			System.out.print("2(0)");
			return ;
		}
		if(n==2)
		{
			System.out.print("2");
			return ;
		}
		if(n==3)
		{
			System.out.print("2+2(0)");
			return ;
		}

递归体:

int t=0;
		int sum=1;
		while(sum<=n)
		{
			sum*=2;
			t++;
		}
		//找到对于n来说最大的幂次数t和幂次数对应的值sum
		sum/=2;
		t--;
		if(sum==n)//刚好是2的t次幂等于n的情况
		{
			System.out.print("2(");
			f(t);
			System.out.print(")");
		}
		else//其他情况,就要带上加号了
		{
				
				System.out.print("2(");
				f(t);
				System.out.print(")+");
				f(n-sum);
		}

第一题:

测试代码:

测试代码原理:
将相应的十进制的字符串和进制数作为参数传进函数中,即进行一个将b进制数转换为十进制数的反运算过程,将得到的数据与原输入数据比较,相等则说明测试成功。

//以下为测试代码
	public static int test(StringBuffer n,int b)//测试代码,将b进制数转换为十进制数
	{
		int sum=0;
		int i=0;
		int l=n.length();
		int ll=l;
		while(l>0&&i<ll)
		{
			int t=n.charAt(l-1);//获取当前位上的字符
			if(t<='9'&&t>='0')
			{
				sum+=(t-'0')*Math.pow(b,i);
			}
			else
			{
				switch(t)
				{
					case 'A':
						sum+=10*Math.pow(b,i);
						break;
					case 'B':
						sum+=11*Math.pow(b,i);
						break;
					case 'C':
						sum+=12*Math.pow(b,i);
						break;
					case 'D':
						sum+=13*Math.pow(b,i);
						break;
					case 'E':
						sum+=14*Math.pow(b,i);
						break;
					case 'F':
						sum+=15*Math.pow(b,i);
						break;
					default:
							break;
				}
			}
			i++;
			l--;
			
		}
		return sum;
	}

运行截图·:
第一题:

在这里插入图片描述

第二题:
在这里插入图片描述

总结:
此次一开始做题时,对于相应的递归出口没有设计好,出现了栈溢出的情况,对于这种情况,发现是递归调用无出口的问题,一直在递归自身而没有到递归出口的地方,相当于死循环,而栈空间大小是确定的,一旦超过这个界限,即会溢出。
在设计递归结构时,要充分利用栈先进后出的特点

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值