Convert Recursion to Iteration
Posted on October 1, 2019
Tags: induction
def recfac(n):
if n == 0:
return 1
else:
return n * recfac(n-1)
#assume r is fac(n-1)
#design facInc to equal fac(n)
#facInc = n * fac(n-1)
def facInc(n,r):
return n*r
#basecase is i == 0 then return r = 1
#facInc(i,r) is i * fac(i-1)
#when i == n, it becomes fac(n,r) = n * fac(n-1)
def fac3(n):
i = 0
r = 1
while(i != n):
i = i + 1
r = facInc(i,r)
return r
#due to associativity
def fac4(n):
i = 0
r = 1
x = n
while(i != x):
r = facInc(r,x)
x = x-1
return r
def foo(x):
if x > 1:
if x <= 50:
return 4
else:
return x * x + foo(x-7)
else:
return 20
def fooinc(i,r):
return i*i+r
def foo1(x):
xa = x
r = None
#first while finds the correct base case
while True:
if xa > 1:
if xa <= 50:
r = 4
break
else:
xa = xa - 7
else:
r = 20
break
#second while builds from the base to answer
while (xa != x):
xa = xa + 7
r = fooinc(x,r)
return r
def sqrlist(x):
if x == []:
return []
else:
return [(x[0]*x[0])] + sqrlist(x[1:])
#decrement is cdr or x[1:]
#x_o = x$y = cons(y,x)
def sqrlist0(x):
xa = x
stack = []
r = None
while True:
if xa == []:
r = []
break
else:
stack = [xa[0]] + stack
xa = xa[1:]
while xa != x:
xa = [stack[0]] + xa
stack = stack[1:]
r = [xa[0]*xa[0]]+r
return rstack = []
stack.append(5)
base = 1
while stack != []:
arg = stack.pop()
if arg == 1:
break
base = arg*base
IH = arg - 1
stack.append(IH)
print(base)