#! perl -slw use strict; sub show { my ( $ary, $swaps ) = @_; printf "%2d swaps => %s\n", $swaps, join ' ', @$ary; } sub swapElems { my $t = $_[0][ $_[1] ]; $_[0][ $_[1] ] = $_[0][ $_[2] ]; $_[0][ $_[2] ] = $t; print "[@{$_[0]}] $_[1] <=> $_[2]" } sub do_swaps { my( $ary, $x, $y, $swaps ) = @_; print "do_swaps: $x .. $y"; return $swaps if $y == @$ary; my $saved_y = $y; for( $x .. $y - 1 ) { $y = $saved_y if $y == @$ary; swapElems( $ary, $x++, $y++ ); ++$swaps; } return do_swaps( $ary, $x, $y, $swaps ); } sub swap { my ( $ary, $offset ) = @_; my $swaps = do_swaps( $ary, 0, $offset, 0 ); show( $ary, $swaps ); } #swap( [ qw( a b c 1 2 3 ) ], 3 ); # aref, offset of Y0 #swap( [ qw( a b c d 1 2 ) ], 4 ); #swap( [ qw( a b c d e 1 ) ], 5 ); swap( [ qw( a b c d e f g h i j 1 2 3 4 5 6 7 8 ) ], 10 ); #swap( [ qw( a b c d e f 1 2 3 ) ], 6 );