将递归算法转换为迭代

时间:2017-04-16 19:01:58

标签: python recursion iteration

enter image description here

我在Python中完成了递归函数:

def Rec(n):
    if (n<=5):
        return 2*n
    elif (n>=6):
        return Rec(n-6)+2*Rec(n-4)+4*Rec(n-2)
print (Rec(50))

但我无法想到迭代的一个 我确信我需要使用循环并且可能有4个变量来存储以前的值,模仿堆栈。

2 个答案:

答案 0 :(得分:1)

对于你的特定问题,假设你有一个输入n,下面的代码应该在python中迭代地计算函数。

val = []
for i in range(6):
    val.append(2*i)

for i in range(6,n+1):
    val.append( val[i-6] + 2*val[i-4] + 4*val[i-2] )

print(val[n])

答案 1 :(得分:0)

我得到了这个答案:

$ python test.py
Rec(50) = 9142785252232708
Kist(50) = 9142785252232708

使用以下代码。这个想法是你的函数需要一个先前值的“窗口” - Kn-6,Kn-4,Kn-2 - 并且当你计算新值时,该窗口可以“滑动”。

所以,对于像“14”这样的值,你会有一个K8,K9,... K13的窗口。只需使用这些值计算,然后删除K8,因为你永远不会再使用它,并附加K14,这样你就可以在计算K15..20中使用它。

def Rec(n):
    if (n<=5):
        return 2*n
    elif (n>=6):
        return Rec(n-6)+2*Rec(n-4)+4*Rec(n-2)

def Kist(n):
    if n <= 5:
        return 2 * n

    KN = [2*n for n in range(6)]
    for i in range(6, n+1):
        kn = KN[-6] + 2 * KN[-4] + 4 * KN[-2]
        KN.append(kn)
        KN = KN[-6:]

    return KN[-1]


print("Rec(50) =", Rec(50))
print("Kist(50) =", Kist(50))