递归程序设计(2-16进制转换)
- 作业题目
题目1:将非负十进制整数n转换成b进制。(其中b=2~16)
- 算法构造
递归公式:y = a(n) % b
a(n+1) = a(n) // b
y为余数,b为目标进制
递归出口:a(n+1) != 0
初始条件:输入的数与目标进制
递归栈调用过程:
以5的2进制转化为例
递归运行层次 |
运行语句行号 |
递归工作栈状态 |
说明 |
|||
1 |
9,10,11,12,13,14 |
|
由主函数进入第一层递归后,运行至语句(行)14,递归调用下一层 |
|||
2 |
9,10,11,12,13,14 |
|
由第一层的语句(行)14进入第二层递归,运行至语句(行)14,递归调用第三层 |
|||
3 |
9,10,11,12,13,14 |
|
第三层递归执行知语句(行)11,求出值为0,从语句(行)13退出第三层,返回至第二层的语句(行)14 |
|||
2 |
14 |
|
执行第二层的语句(行)14,从语句(行)14退出第二层,返回至第一层的语句(行)14 |
|||
1 |
14 |
|
执行第一层的语句(行)14, 然后继续进行后续处理 |
|||
0 |
|
栈空 |
继续运行主函数 |
程序
""" @文件:进制转化 @说明:进制转化 @时间:2019.6.6 """ # 进制转化(递归) def Change(remainder_gather,binary,number): # 余数:remainder 进制:binary 集合:gather binary_number = "" remainder = number % binary number = number // binary remainder_gather.append(str(remainder)) if number != 0: # 递归出口 Change(remainder_gather, binary, number) # 递归函数 else: for x in range(0, len(remainder_gather)): if remainder_gather[x] == "10": remainder_gather[x] = "A" elif remainder_gather[x] == "11": remainder_gather[x] = "B" elif remainder_gather[x] == "12": remainder_gather[x] = "C" elif remainder_gather[x] == "13": remainder_gather[x] = "D" elif remainder_gather[x] == "14": remainder_gather[x] = "E" elif remainder_gather[x] == "15": remainder_gather[x] = "F" for y in range(0, len(remainder_gather)): binary_number = binary_number + remainder_gather[y] binary_number = binary_number[::-1] print("递归转化结果:" + binary_number) # 进制转化(非递归) def Another_Change(number, binary): binary_number = "" while number != 0: # 直到 商=0 remainder = number % binary number = number // binary if str(remainder) == "10": remainder = "A" elif str(remainder) == "11": remainder = "B" elif str(remainder) == "12": remainder = "C" elif str(remainder) == "13": remainder = "D" elif str(remainder) == "14": remainder = "E" elif str(remainder) == "15": remainder = "F" binary_number = binary_number + str(remainder) binary_number = binary_number[::-1] print("非递归转化结果:" + binary_number) if __name__ == "__main__": number = int(input("请输入一个数:")) binary = int(input("请输入目标进制(2-16):")) remainder_gather = [] Change(remainder_gather, binary, number) Another_Change(number, binary)
- 调试、测试及运行
调试
第一层递归
第二层递归
第三层递归
测试及运行
- 经验总结
RecursionError: maximum recursion depth exceeded in comparison
python专门设置的一种机制用来防止无限递归造成Python溢出崩溃,最大默认深度为1000,可采用sys.setrecursionlimit()函数来改变最大递归深度。
对于含有递归特征的问题,最好设计递归形式的算法。但也不要单纯追求形式。应在算法设计的分析过程中“就事论事”。例如,在利用分割求解设计算法时,子问题和原问题的性质相同;或者,问题的当前一步解决之后,余下的问题和原问题性质相同,则自然导致递归求解。
实现递归函数,目前必须利用“栈”。一个递归函数必定能改写为利用栈实现的非递归函数,反之,一个利用栈实现的非递归函数可以改写为递归函数。需要注意的是递归函数递归层次的深度决定所需存储量的大小。
分析递归算法的工具是递归树,从递归树上可以得到递归函数的各种相关信息。例如:递归树的深度即为递归函数的递归深度;递归树上的结点数目恰为函数中的主要操作重复进行的次数;若递归树蜕化为单支树或者递归树中含有很多相同的结点,则表该递归函数不适用。
递归函数中的尾递归都是可以容易消除的。
递归函数一定要有一个递归出口。即整个递归函数应该是收敛的。规模应该越来越小。