递归程序设计(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

5

 

由主函数进入第一层递归后,运行至语句(行)14,递归调用下一层

2

9,10,11,12,13,14

2

5

 

由第一层的语句(行)14进入第二层递归,运行至语句(行)14,递归调用第三层

3

9,10,11,12,13,14

0

2

5

 

第三层递归执行知语句(行)11,求出值为0,从语句(行)13退出第三层,返回至第二层的语句(行)14

2

14

2

5

 

执行第二层的语句(行)14,从语句(行)14退出第二层,返回至第一层的语句(行)14

1

14

5

 

执行第一层的语句(行)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()函数来改变最大递归深度。

 

对于含有递归特征的问题,最好设计递归形式的算法。但也不要单纯追求形式。应在算法设计的分析过程中“就事论事”。例如,在利用分割求解设计算法时,子问题和原问题的性质相同;或者,问题的当前一步解决之后,余下的问题和原问题性质相同,则自然导致递归求解。

实现递归函数,目前必须利用“栈”。一个递归函数必定能改写为利用栈实现的非递归函数,反之,一个利用栈实现的非递归函数可以改写为递归函数。需要注意的是递归函数递归层次的深度决定所需存储量的大小。

分析递归算法的工具是递归树,从递归树上可以得到递归函数的各种相关信息。例如:递归树的深度即为递归函数的递归深度;递归树上的结点数目恰为函数中的主要操作重复进行的次数;若递归树蜕化为单支树或者递归树中含有很多相同的结点,则表该递归函数不适用。

递归函数中的尾递归都是可以容易消除的。

递归函数一定要有一个递归出口。即整个递归函数应该是收敛的。规模应该越来越小。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值