递归求解进制转换

第六章作业

  • 题目分析

 基础要求:

题目:要求将10进制数转换为2-16进制。

递归实现:先找递归出口,我们采用除d倒取余的方法求进制转换,很明显递归出口就是当n等于0时,当n等于0时,递归结束,输出转换结果。再找递归公式,发现,每次递归循环时,只改变n的值,每次n的值都整除d。所以递归公式为change(str,n/d,d)。

非递归实现:将递归循环转换为while循环,循环退出条件为n=0;

n每次更新为n/d;

提高要求:

题目:输入:正整数(n≤20000)

输出:符合约定的n的0,2表示(在表示中不能有空格)

列如:1315最后可表示为:

2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)

递归实现:

先找递归出口,根据题目分析,最后要转换成0,2的表示,所有的数都表示成0,2,特别2(1)表示成2。很明显,递归出口不只一个,当n等于0,1,2时各一个出口,输出2(0),2,2(2);

再找递归公式,对每个2的(m)中的m循环,用位运算,右移1

位,除二,取出所有有值的位,进行输出2(d)的格式,将每一个数都转换为0,2的格式。只要不是0,1,2的2进制都进行递归。

所以递归公式change(i>>1)仅当i&1>0;

  • 递归模型和递归栈

基础要求:

递归模型:

{   return str; n==0

Change(str,n,d)

Return change(str,n/d,d)n!=0

}

  递归栈:以5的二进制位例;

递归的层次

递归栈的状态(n的值)

说明

1

Change(5)

第一次递归入栈

2

Cahnge(2)

Change(5)

由第一层进入第二层

第二次递归,入栈

3

Change(1)

Cahnge(2)

Change(5)

由第二层进入第三层

第三次递归,入栈

4

Change(0)

Change(1)

Change(2)

Change(5)

由第三层进入第四次递归,进入第四次递归,入栈

5

Change(1)

Change(2)

Change(5)

得change(0)的值,出栈

6

Change(2)

Change(5)

得change(1)的值,出栈

7

Change(5)

得change(2)的值,出栈

8

栈空

得change(5)的值,出栈

 

提高要求:

递归模型:change(n){

Return :Print(2(0));n==0;

Return :Print(2);n==1;

Return :Print(2(2)); n==2;

Change(n>>1) n!=0,1,2;

}

  • 测试,调试,运行结果

基础要求:

余数赋值:

测试代码:

Scanner in=new Scanner(System.in);

int n=in.nextInt();

System.out.println(j.fuzhi(n));

递归求解进制转换

运行结果:

递归求解进制转换

提高要求:

测试:

进入第一层循环

递归求解进制转换

进入第二层循环

递归求解进制转换

进入第三次循环

递归求解进制转换

在第三次循环中,3=2+1,则分别输出

递归求解进制转换

 

递归求解进制转换

递归求解进制转换

递归求解进制转换

进第四次循环

递归求解进制转换

退循环:

递归求解进制转换

递归求解进制转换

退循环

递归求解进制转换

退循环

递归求解进制转换

 

  • 总结
    1)了解了递归和栈的关系,将无法求的先入栈,一直到递归出口,也就是能求解的递归公式,然后一个个出栈,倒着求目标函数。
  1. 非递归和递归的转化,一种是迭代的方法,例如进制转换的题,就是这样转变成非递归的。用while循环来表达递归的迭代。还有就是将其利用和栈的关系,用出栈和入栈来转换。
  2. 递归的关键就是寻找递归出口和递归公式,只要找到这两点,就能搭建出递归模型,进行求解。