递归应用2

递归应用

1.题目分析:
第一题:将非负十进制整数n转换成b进制。(其中b=216)主要思路是:参照十进制数转换为二进制数方法(除2取余直到被除数值为0),此题应该对分符十进制整数n进行除以b,取余数,直到数n的值为0,此处需要注意①如果将每次的余数存到某个数组或者字符串中,所存入的b进制数与要求得b进制数元素顺序相反,输出前应进行调整。②参照16进制转换方法(余数大于9用AF表示),当转化二进制数的时候应该判断每次的余数是否大于9,若大于应用A~F表示进制数。③递归方法停止条件是被除数值为0。④非递归方法的循环停止条件也是被除数值为0。
第二题:将任意一个正整数用2的幂次方表示。(例如137可表示为:2(2(2)+2+2(0))+2(2+2(0))+2(0))初始思路为:找到最接近输入正整数的数(该数满足2的幂次,且该数小于等于要求的正整数),求出该数是2的多少幂次。判断该幂次是否等于1或0,若不等于继续对该幂次进行分解(找到接近该幂次值的数,判断该数是2的多少幂次(当判断的幂次值等于0或1,得到2或2(0)的字符串。)),将判断结果存到字符串中。然后再找出剩下的数值(剩下的数等于该正整数减去上次找到的数)满足2的多少幂次的数(判断该幂次是否等于1或0,若不等于继续对该幂次进行分解(找到接近该幂次值的数,判断该数是2的多少幂次),(当判断的幂次值等于0或1,得到2或2(0)的字符串。),将判断结果存到字符串中,将两部分求得的字符串相加,就是最终结果。
2.算法思路
第一题:建立函数String translate(int number,int b)对数number进行b进制数的转化。递归方法:递归条件number==0;递归体:number自除b,静态字符串变量str+=yu(number除以b的余数,字符串添加余数时,应进行判断:余数是否大于9,若大于9,余数用A~F代替str+=Char(yu-10)+A)),最终得到的结果需要进行顺序颠倒(定义StringBuffer对象,运用reverse()方法将每一位的数值颠倒)。非递归方法:运用while执行循环体(主要功能和递归方法相同),循环条件number!=0;
第二题:用到递归方法,递归停止条件:条件1:当num值为1时,数化为2(0) 递归停止条件2:当num值为2时,数值化为2,递归体:每次递归先找到最接近目标值num的最大的小于等于的数值c,然后记录该数是二的i次方,如果二者相等那么不需要再添加加号,如果不是那么还需添加加号,此处分为两层递归,一边递归找到i的值,另一边递归剩下的值(num-c).(此算法参考Davenny的《递归小结》https://blog.csdn.net/davenny/article/details/54558170)
3.具体算法
第一题:

递归应用2_第1张图片

递归应用2_第2张图片
第二题:
递归应用2_第3张图片
4.运行结果及测试、调试截屏。
第一题:
① 递归运行结果
递归应用2_第4张图片
② 非递归运行结果
递归应用2_第5张图片
③ 测试转化进制方法
递归应用2_第6张图片

第二题:
① 递归运行结果
在这里插入图片描述
② 试找到最接近的2的幂次数方法
递归应用2_第7张图片
调试截屏:
递归应用2_第8张图片

5.总结
通过本次实验我了解并掌握了递归作为编程里最为重要的编程方法之一,其对于解决某些复杂的问题十分有效,并且相对于迭代,其过程在直观上更容易理解。而且不像迭代自己需要维护许多变量,递归也更容易实现。
递归的基本思想是递归并不是简单的自己调用自己,也不是简单的交互调用。递归在于把问题分解成规模更小、具有与原来问题相同解法的问题,如二分查找以及求集合的子集问题。这些都是不断的把问题规模变小,新问题与原问题有着相同的解法。但是并不是所有可以分解的子问题都能使用递归来求解。一般来说使用递归求解问题需要满足以下的条件:
可以把要解决的问题转化为一个子问题,而这个子问题的解决方法仍与原来的解决方法相同,只是问题的规模变小了。原问题可以通过子问题解决而组合解决。(参考 Blskx的博客《浅谈递归》)
在今后的学习过程中,我将应用递归的算法思想:在分析问题时采用自下而上,先分析简单情况,然后看复杂情况是否可以由简单情况组合形成,也可以自上而下,把复杂问题分解成子问题,在此过程中需要注意子问题是否有重叠。

你可能感兴趣的:(递归应用2)