in reply to Re: Rotating an array
in thread Rotating an array

Why physically move anything?
Because the array is passed on to another function, and the interface to that functions says that it processes the list from the first element to the last. An iterator would makes sense if I process the array myself.

-- 
Ronald Fischer <ynnor@mm.st>

Replies are listed 'Best First'.
Re^3: Rotating an array
by BrowserUk (Patriarch) on Jun 17, 2011 at 12:59 UTC
    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

    Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
    "Science is about questioning the status quo. Questioning authority".
    In the absence of evidence, opinion is indistinguishable from prejudice.
      It is passed as a list; and, for a given input data set, rotation is done only once.

      Thank you very much for your examples!

      -- 
      Ronald Fischer <ynnor@mm.st>