|
Vypocet v zoznamovej monade:
>>> import operator
>>> concat = lambda xs: reduce(operator.concat, xs, [])
>>> fm = lambda p,xs: [[]] if not xs else concat([map(lambda y: [xs[0]]+y, fm(p,xs[1:])) if b else fm(p,xs[1:]) for b in p(xs[0])])
>>> fm(lambda _: [True, False], [1,2,3,4])
[[1, 2, 3, 4], [1, 2, 3], [1, 2, 4], [1, 2], [1, 3, 4], [1, 3], [1, 4], [1], [2, 3, 4], [2, 3], [2, 4], [2], [3, 4], [3], [4], []]
Specializovanejsi postup:
>>> fm = lambda xs: [[]] if not xs else map(lambda y: [xs[0]]+y, fm(xs[1:])) + fm(xs[1:])
>>> fm([1,2,3,4])
[[1, 2, 3, 4], [1, 2, 3], [1, 2, 4], [1, 2], [1, 3, 4], [1, 3], [1, 4], [1], [2, 3, 4], [2, 3], [2, 4], [2], [3, 4], [3], [4], []]
|
|