zoukankan      html  css  js  c++  java
  • 一个貌似比较吊的递归转换为loop--总算成功了.--第二弹

    前段时间用类似于散弹式编程的方式,各种猜测-运行验证-修正结果,最终成功转换了一个看起来比较有难度的递归函数.但总觉得很蛋疼,原因如下:

    1.虽然正确,但是逻辑搞得比较复杂.现在去看,一头雾水,不知道当时是怎么想的,也没有任何欲望去理解.

    2.没有充分利用本地变量,而是保守地把当前栈的数据一股脑绑定到Stack对象上.

    3.我需要用一个Class来保存栈吗?是不是太重了?为什么不考虑用一个简单的tuple来实现呢?

    def recur(n):
        if n==1:
            return 1,0
        return min([(2*recur(n-i)[0]+2**i-1,i) for i in range(n-1,0,-1)],key=lambda x:x[0])
    
    def readable_recur(n):
        if n==1:
            return 1,0 
        possible=[]
        for choice in range(n-1,0,-1):
            res = readable_recur(n-choice)
            value = 2*res[0] + 2**choice-1
            possible.append((value,choice))
        res = min(possible,key=lambda x:x[0])
        return res
    
    def while_stacks(n):
        stacks = [(0,n,[],None,)]
        while stacks:
            stg,n,possible,choice=stacks.pop()
            if stg==0:
                if n==1:
                    res = 1,0
                else:
                    stacks.append((1,n,possible,n-1))
                    stacks.append((0,1,[],None))
            else:
                value = 2*res[0] + 2**choice-1
                possible.append((value,choice))
                if choice > 1:
                    stacks.append((1,n,possible,choice-1))
                    stacks.append((0,n-choice+1,[],None))
                else:
                    res = min(possible,key=lambda x:x[0])
        return res

    这次是彻底理解了recur递归过程中栈的变化过程,因此写出来的while思路也很清晰,绝对不会像上次那样复杂蛋疼让人没有阅读的欲望.对比上次那一大坨,性能也更好了.快了一倍.

  • 相关阅读:
    Effective C++第三遍
    SQL基础教程
    hibernate 数据关联多对多
    hibernate 数据关联一对一
    hibernate 数据关联一对多
    hibernate Criteria查询
    hibernate HQL查询
    hibernate 持久化对象的生命周期
    hibernate的配置
    微博登录
  • 原文地址:https://www.cnblogs.com/xiangnan/p/3606540.html
Copyright © 2011-2022 走看看