sub fannkuch { my ( $a, $level, $split ) = ( @_, 0, 1 ); my ( $index, $ok, $copy ) = ( $level, $level + 1 == length( $a ), $a ); if ($ok) { # print "Before munging: ($split) ", unpack('C*', $copy); $index = $split - 1; substr($copy, $index, 0) = chop($copy); } do { if ($ok) { # print "($split) ", unpack('C*', $copy); my $q = $copy; my ( $k, $flips ); for ( $flips = 0; ( $k = ord( $q ) ) != 1; $flips++ ) { substr( $q, 0, $k ) = reverse substr( $q, 0, $k ); } if ( $flips >= $maxflips ) { if ( $flips == $maxflips) { push @max_sequence, $copy; } else { $maxflips = $flips; @max_sequence = ($copy); } } } else { fannkuch( $copy, 1 + $level, $split ); $split = $level + 1 if $index == $split; } substr( $copy, $index - 1, 2 ) = reverse substr( $copy, $index -1, 2 ); } while $index--; return $maxflips; }