Marko Rauhamaa <ma...@pacujo.net>: > def f(n): > def auxf1(sum, m, i): > if i == n: > return sum > else: > def auxf2(sum, m, i): > if sum % m == 0: > return auxf1(sum, m + 1, i) > else: > return auxf1(sum, m, i) > return auxf2(sum + m * i, m, i + 1) > return auxf1(0, 1, 0) > > cheating slightly with locally named functions. > > If cheating is not allowed, you will need a Y combinator construct...
... and here's the same function without cheating: f = (lambda n: (lambda auxf1, auxf2: auxf1(auxf1, auxf2, 0, 1, 0))( lambda auxf1, auxf2, sum, m, i: sum if i == n else auxf2(auxf1, auxf2, sum + m * i, m, i + 1), lambda auxf1, auxf2, sum, m, i: auxf1(auxf1, auxf2, sum, m + 1, i) if sum % m == 0 else auxf1(auxf1, auxf2, sum, m, i))) ... or replacing the conditional with arrays: f = (lambda n: (lambda auxf1, auxf2: auxf1(auxf1, auxf2, 0, 1, 0))( lambda auxf1, auxf2, sum, m, i: [lambda m: auxf2(auxf1, auxf2, sum + m * i, m, i + 1), lambda m: sum][i == n](m), lambda auxf1, auxf2, sum, m, i: [lambda m: auxf1(auxf1, auxf2, sum, m, i), lambda m: auxf1(auxf1, auxf2, sum, m + 1, i)][sum % m == 0](m))) It is possible to get rid of the arrays and numbers, too. Combinatory logic would allow us to get rid of the local variables. At the pinnacle of functional programming is iota: <URL: https://en.wikipedia.org/wiki/Iota_and_Jot> The iota programming language has only one primitive value, the Swiss-army-knife function ι, which can express Life, Universe and Everything: ι = lambda f: (f(lambda x: lambda y: lambda z: (x(z))(y(z))))( lambda q: lambda i: q) Marko -- https://mail.python.org/mailman/listinfo/python-list