我将在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循环的基本结构,我相信我可以弄清楚其余部分。感谢。
答案 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))
我颠倒了最后三个语句的顺序,以保留原始递归方法中评估它们的顺序。这是必要的,因为附加的最后一件事将是弹出的第一件事。