$| = 1; my @a = qw(0 1 3 2 6 4 5 7); sub a { my $n = shift; if ($n < 8) { return $a[$n]; } my $k=3; while (1) { if (2**$k <= $n && $n < 2**($k+1)-($k+1)) { return a($n-2**$k+1)+2**$k; } if ($n == 2**($k+1)-($k+1)) { return 2**$k; } if (2**($k+1)-($k+1) < $n && $n < 2**($k+1)) { return a($n-2**$k)+2**$k; } $k++; } } foreach my $n (1..10_000) { my $a = a($n); print "$n $a\n"; }