递归求进制问题

题目:将非负十进制整数n转换成b进制。(其中b=2~16)
一、算法构造
递归实现:1、先找递归出口,我们采用除进制倒取余的方法求进制转换,很明显递归出口就是当整数等于0时,当整数等于0时,递归结束,输出转换结果。
2、再找递归公式,发现每次递归循环时,只改变整数的值,每次整数的值都整除进制。所以递归公式为f(t,n/v,v)。t指的是输出的字符串,将每次得到的余数按照倒序的方式加起来,就能得到转换的结果。
非递归实现:使用while循环,将循环退出的条件设为n=0,其余和递归体基本一样。
二、递归模型和递归栈
1、递归模型:![在这里插入图片描述](https://img-blog.csdnimg.cn/20190609193346516.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzg2ODAyNQ==,size_16,color_FFFFFF,t_70在这里插入图片描述
2、递归栈:

在这里插入图片描述
三、实现代码

import java.util.Scanner;

public class Transform {
	public static void main(String[] args) {
		Transform t=new Transform();
		Scanner scan=new Scanner(System.in);
		System.out.println("请输入一个非负整数:");
		int x=scan.nextInt();
		System.out.println("请输入进制:(2-16)");
		int v=scan.nextInt();
		System.out.println("递归:\n"+v+"进制:"+t.system1("", x, v));
		System.out.println("非递归:\n"+v+"进制:"+t.system2(x, v));
	}
	String value(int n) {
		if(n<10) {
			return String.valueOf(n);
		}else {
			return String.valueOf((char)(n+55));
		}
	}
	String system1(String t,int x,int v) {
		if(x==0) {
			return t;
		}else {
			return system1(value(x%v)+t ,x/v,v);
		}
	}
	String system2(int x,int v) {
		String t="";
		while(x!=0) {
			t=value(x%v)+t;
			x=x/v;
		}
		return t;
	}
}

四、总结
1、递归的关键就是寻找递归出口和递归公式,只要找到这两点,就能搭建出递归模型,
进行求解。
2、非递归和递归的转化,一种是迭代的方法,例如进制转换的题,就是这样转变成非递归的。用while循环来表达递归的迭代。还有就是将其利用和栈的关系,用出栈和入栈来转换。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值