一个貌似比较吊的递归转换为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思路也很清晰,绝对不会像上次那样复杂蛋疼让人没有阅读的欲望.对比上次那一大坨,性能也更好了.快了一倍.

 

 

posted @ 2014-03-17 23:34  LisPythoniC  阅读(300)  评论(0编辑  收藏  举报