首页 > 其他 > 详细

记住经典的斐波拉契递归和阶乘递归转换为while规律

时间:2014-03-18 12:02:23      阅读:456      评论:0      收藏:0      [点我收藏+]

记住经典的斐波拉契递归和阶乘递归转换为while规律.它为实现更复杂转换提供了启发性思路.

bubuko.com,布布扣
# 斐波拉契--树形递归

def fab(n):
    if n<3:
        return n
    return fab(n-1)+fab(n-2)

def wfab(n):
    stacks=[(0,n,None)]
    while stacks:
        stg,n,value=stacks.pop()
        if stg==0:
            if n<3:
                res=n
            else:
                stacks.append((1,n,None))
                stacks.append((0,n-1,None))
        elif stg==1:
            stacks.append((2,n,res))
            stacks.append((0,n-2,None))
        else:
            res=value+res
    return res            

#阶乘--线性递归

def fac(n):
    if n<1:
        return 1
    return n*fac(n-1)

def wfac(n):
    stacks=[(0,n)]
    while stacks:
        stg,n=stacks.pop()
        if stg==0:
            if n<1:
                res=1
            else:
                stacks.append((1,n))
                stacks.append((0,n-1))
        elif stg==1:
            res=res*n
    return res
bubuko.com,布布扣

理解了原理,即每出现一次递归调用,先对当前栈做一个记号,再创建一个新栈,对应递归调用.比如,将fab略微改变一下,有更多系数,操作符和递归调用,次序也不是按照n-1,n-2这样来,也能比较容易地模拟出来:

bubuko.com,布布扣
def fab(n):
    if n<4:
        return n
    return (3*fab(n-3)-2*fab(n-1))*4*fab(n-2)
bubuko.com,布布扣

仿照上面可转化为:

bubuko.com,布布扣
def wfab(n):
    stacks=[(0,n,None)]
    while stacks:
        stg,n,value=stacks.pop()
        if stg==0:
            if n<4:
                res=n
            else:
                stacks.append((1,n,None))
                stacks.append((0,n-3,None))
        elif stg==1:
            stacks.append((2,n,3*res))
            stacks.append((0,n-1,None))
        elif stg==2:
            stacks.append((3,n,value-2*res))
            stacks.append((0,n-2,None))
        else:
            res=value*4*res
    return res
bubuko.com,布布扣

记住经典的斐波拉契递归和阶乘递归转换为while规律,布布扣,bubuko.com

记住经典的斐波拉契递归和阶乘递归转换为while规律

原文:http://www.cnblogs.com/xiangnan/p/3606573.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!