美文网首页这个我学过么?
学习python3的野路子——递归

学习python3的野路子——递归

作者: HerdingCat | 来源:发表于2019-03-03 21:44 被阅读0次

    递归[1]:直观的感受是与归纳法相似。必须要有的两个部分:递归基、递归规则。

    • 递归基保证递归能返回结果。
    • 递归规则使得问题规模减少,即保证抵达递归基。
      某社区,对于递归的有趣讨论[2]

    以下的编程题,本文作者通过建立图模型,对图采用深度优先搜索,同时做适当的剪枝解决的。由于python3对输出的限制,因此对结果做了处理。


    关于具体的算法实现
    # PAT中的基础编程题目集函数题7-37
    def dec(x, ans, seq): # x是当前待分解的整数;ans是所有分解情况;seq是当前分解结果
        if x == 1: # 递归基
            seq.append('1')
            ans.append(seq[: ]) # copy a list
            seq.pop()
        else :
            for i in range(1, x):
                if len(seq) > 0 and int(seq[-1]) > i: # 剪枝,避免2+3+2出现
                    continue
                seq.append(str(i))
                if int(seq[-1]) > x - i: # 剪枝,保证分解项递增,避免6+1出现
                    seq.pop()
                    continue
                dec(x - i, ans, seq)
                seq.pop()
            seq.append(str(x)) # 考虑本身也是一个分解
            ans.append(seq[: ])
            seq.pop()
    
    n = eval(input())
    ans = []
    inans = cnt = 0
    pattern = str(n) + '='
    dec(n, ans, seq = [])
    
    for equ in ans: # 该循环用于控制输出
        cnt += 1
        inans += 1
        inequ = 0
        for i in equ:
            if inequ:
                pattern += '+'
            pattern += i
            inequ += 1
        if cnt % 4 == 0:
            print(pattern)
            pattern = str(n) + '='
            cnt = 0
        elif inans != len(ans) :
            pattern += ';' + str(n) + '='
    if cnt:
        print(pattern)
    

    参考


    1. http://www.nowamagic.net/librarys/veda/detail/2314

    2. https://www.zhihu.com/question/20507130

    相关文章

      网友评论

        本文标题:学习python3的野路子——递归

        本文链接:https://www.haomeiwen.com/subject/pspleqtx.html