如果原始函数有很多递归调用,如何使循环函数使用while循环?

时间:2014-02-21 17:58:26

标签: python recursion while-loop branch

我将在python中演示,因为它很容易阅读....

    def loop(N,x,y):
        if N < n:                         #condition is defined elsewhere
            side = 1.0 / (2.0**(n+1))
            addTriangle(picture,x,y,side)
            loop(N+1, x - .25*side, y - math.sqrt(.75)/2*side)
            loop(N+1, x + .75*side, y - math.sqrt(.75)/2*side)
            loop(N+1, x + .25*side, y + (side/4.0)*math.sqrt(3))
    loop(0, .25, math.sqrt(.75)/2)

我需要重写此函数以避免使用递归。但是,它具有这种分支属性,使它有点棘手。如何构建我的函数以不使用递归?如果你能为我提供while / for循环的基本结构,我相信我可以弄清楚其余部分。感谢。

1 个答案:

答案 0 :(得分:0)

创建一个arguments堆栈,用于跟踪您要制作的电话,但尚未制作。您通常会调用loop,而不是推入堆栈。一旦arguments为空,您就可以返回。

def loop(N, x, y):
    arguments = [(N, x, y)]
    while arguments:
        N, x, y = arguments.pop()
        if N < n:
            side = 1.0 / (2.0**(n+1))
            addTriangle(picture,x,y,side)
            arguments.append((N+1, x + .25*side, y + (side/4.0)*math.sqrt(3)))
            arguments.append((N+1, x + .75*side, y - math.sqrt(.75)/2*side))
            arguments.append((N+1, x - .25*side, y - math.sqrt(.75)/2*side))

我颠倒了最后三个语句的顺序,以保留原始递归方法中评估它们的顺序。这是必要的,因为附加的最后一件事将是弹出的第一件事。