def ackCS(m, n): if (0 == m): return n + 1 elif (0 == n): return CS(args=lambda: ackCS(m - 1, 1), memo=(m, n)) else: return CS(fold=lambda a, b: CS(args=lambda: ackCS(a, b), memo=(a, b)), args=[m - 1, lambda: ackCS(m, n - 1)], memo=(m, n))
def go(s, i): if (s == 0): return 1 elif (s < 0 or i >= len(coins)): return 0 else: return CS(fold=lambda x, y: x + y, args=[lambda: go(s, i + 1), lambda: go(s - coins[i], i)], memo=(s, i))
def fib(n): return n if (n < 2) else CS(fold = lambda x, y: x+y, args = [lambda: fib(n-1), lambda: fib(n-2)], memo = n) # print("fib: ", evalCS(fib(50))) # even / odd def isEven(n): return True if (n == 0) else CS(lambda: isOdd(n-1))
def isOdd(n): return False if (n == 0) else CS(lambda: isEven(n-1)) # print("isEven: ", evalCS(isEven(10000))) # print("isOdd: ", evalCS(isOdd(10000))) ###################################################################################### # coin change ###################################################################################### def ccN(s, coins):
def isOdd(n): return False if (n == 0) else CS(args=lambda: isEven(n - 1))
def fib(n): return n if (n < 2) else CS(fold=lambda x, y: x + y, args=[lambda: fib(n - 1), lambda: fib(n - 2)], memo=n)
def isEven(n): return True if (n == 0) else CS(lambda: isOdd(n-1)) def isOdd(n): return False if (n == 0) else CS(lambda: isEven(n-1))
def isOdd(n): return False if (n == 0) else CS(args = lambda: isEven(n-1)) self.assertTrue (evalCS(isEven(10000)))
def foo(n, a): return a if (0 == n) else CS(args = lambda: foo(n-1, n+a)) self.assertEqual(5050, evalCS(foo(100, 0)))
def height(n, m): return 0 if (m <= 0 or n <= 0) else CS(fold = lambda x, y: x+y+1, args = [lambda: height(n, m-1), lambda: height(n-1, m-1)], memo = (n, m))
def fib(n): return n if (n < 2) else CS(fold = lambda x, y: x+y, args = [lambda: fib(n-1), lambda: fib(n-2)], memo = n) self.assertEqual(55, evalCS(fib(10)))
def bar(n): return 0 if (0 == n) else CS(fold = lambda v: n+v, args = lambda: bar(n-1)) self.assertEqual(5050, evalCS(bar(100)))