sub combinations returns Array (@list is rw) { return () unless @list.elems; my @ans; for 1 .. 2**@list.elems-1-> $num { push @ans, [ @list[ (0 .. sqrt($num)).grep:{ $num +& (2**$_) } ] ]; } return @ans; } my @list = (1..4); combinations(@list).perl.say; __OUTPUT__ ([1], [2], [1, 2], [3], [1, 3], [2, 3], [1, 2, 3], [4], [1, 4], [2, 4], [1, 2, 4], [3, 4], [1, 3, 4], [2, 3, 4], [1, 2, 3, 4])