in reply to Re^2: Rotating an array
in thread Rotating an array
Because the array is passed on to another function
As a list or an array ref?
If the former, then you can again avoid physically moving the data by slicing it to produce the list.
Of course, if you are only rotating the array once per program run, then it doesn't much matter. But if you need several different rotations during the program run, then it might make sense to avoid moving everything multiple times, if possible.
Silly example code:
#! perl -slw use strict; sub rotateAll{ my( $aref, $n ) = @_; $n = $n % @{$aref}; return ( $n .. $#{$aref}, 0 .. $n-1 ); } sub rotateOne { my( $aref, $n, $i ) = @_; return ( $i + $n ) % @{$aref}; } my @a = 1 .. 5; print "Sliced"; printf "% 3d: %s\n", $_, join ' ', @a[ rotateAll( \@a, $_ ) ] for -7 .. 7; print "\nDiced"; for my $rot ( -7 .. 7 ) { printf "% 3d: ", $rot; print join ' ', map $a[ rotateOne( \@a, $rot, $_ ) ], 0 .. $#a; } __END__ C:\test>910117 Sliced -7: 4 5 1 2 3 -6: 5 1 2 3 4 -5: 1 2 3 4 5 -4: 2 3 4 5 1 -3: 3 4 5 1 2 -2: 4 5 1 2 3 -1: 5 1 2 3 4 0: 1 2 3 4 5 1: 2 3 4 5 1 2: 3 4 5 1 2 3: 4 5 1 2 3 4: 5 1 2 3 4 5: 1 2 3 4 5 6: 2 3 4 5 1 7: 3 4 5 1 2 Diced -7: 4 5 1 2 3 -6: 5 1 2 3 4 -5: 1 2 3 4 5 -4: 2 3 4 5 1 -3: 3 4 5 1 2 -2: 4 5 1 2 3 -1: 5 1 2 3 4 0: 1 2 3 4 5 1: 2 3 4 5 1 2: 3 4 5 1 2 3: 4 5 1 2 3 4: 5 1 2 3 4 5: 1 2 3 4 5 6: 2 3 4 5 1 7: 3 4 5 1 2
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^4: Rotating an array
by rovf (Priest) on Jun 17, 2011 at 14:06 UTC |