Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- def trisum(n, csum):
- if n == 0:
- return csum
- else:
- return trisum(n - 1, csum + n)
- print(trisum(1000, 0))
- >>> def trisum(n, csum):
- ... while True: # change recursion to a while loop
- ... if n == 0:
- ... return csum
- ... n, csum = n - 1, csum + n # update parameters instead of tail recursion
- >>> trisum(1000,0)
- 500500
- lambda f: (lambda x: x(x))(lambda y: f(lambda *args: y(y)(*args)))
- lambda f: (lambda x: x(x))(lambda y: f(lambda *args: lambda: y(y)(*args)))
- def bet(func):
- b = (lambda f: (lambda x: x(x))(lambda y:
- f(lambda *args: lambda: y(y)(*args))))(func)
- def wrapper(*args):
- out = b(*args)
- while callable(out):
- out = out()
- return out
- return wrapper
- >>> from recursion import *
- >>> fac = bet( lambda f: lambda n, a: a if not n else f(n-1,a*n) )
- >>> fac(5,1)
- 120
- >>> fibo = bet( lambda f: lambda n,p,q: p if not n else f(n-1,q,p+q) )
- >>> fibo(10,0,1)
- 55
- >>> bet( lambda f: lambda n: 42 if not n else f(n-1) )(50000)
- 42
- def bet1(func):
- def wrapper(*args):
- out = func(lambda *x: lambda: x)(*args)
- while callable(out):
- out = func(lambda *x: lambda: x)(*out())
- return out
- return wrapper
- class _RecursiveCall(Exception):
- def __init__(self, *args):
- self.args = args
- def _recursiveCallback(*args):
- raise _RecursiveCall(*args)
- def bet0(func):
- def wrapper(*args):
- while True:
- try:
- return func(_recursiveCallback)(*args)
- except _RecursiveCall as e:
- args = e.args
- return wrapper
- >>> f = bet0( lambda f: lambda n: (lambda x: x) if not n else f(n-1) )
- >>> f(5)(42)
- 42
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement