in reply to Re: Re: Iterator for multidimensional arrays
in thread Iterator for multidimensional arrays

If you want the list generated at once, you could use the following snippet by merlyn. If you want an iterative solution, you could use the following. A benefit being that it should work in relatively constant time no matter how big the arrays are.
my @aoa = ( [1,2], ['a','b','c','d'], ['A','B','C'], ); my $iter = make_aoa_iterative(@aoa); while (my @els = $iter->() ){ print @els,"\n"; } sub make_aoa_iterative { my @arefs = @_; my @arrayindexes = (); foreach (@arefs){ push @arrayindexes,[$_,0,$#{$_}]; } return sub { return if $arrayindexes[0]->[1] > $arrayindexes[0]->[2]; my @els = map { $_->[0]->[ $_->[1]] } @arrayindexes; # Check for out of bounds.... $arrayindexes[$#arrayindexes]->[1]++; for (my $i = $#arrayindexes; $i > 0; $i--){ if ($arrayindexes[$i]->[1] > $arrayindexes[$i]->[2 +]){ $arrayindexes[$i]->[1] = 0; $arrayindexes[$i-1]->[1]++; }else{ last; } } return @els; }; }

Update
I'm formal-math challenged. Is this formally a permutation? If someone could clarify, I'd appreciate it.

-Lee

"To be civilized is to deny one's nature."

Replies are listed 'Best First'.
Re: Re(3): Iterator for multidimensional arrays
by jcupp (Acolyte) on Mar 25, 2002 at 03:21 UTC
    Yeah... that's does the trick. I had been working on a version that didn't calc all possible indexes beforehand (but now I'll stop). I'll try calling it "a function that returns all possible vectors in a discrete n-dimensional space." It that trekkie enough?
      My little test is currently on the 103,000,000th permutation. It would probably be really tough if not impossible to do large sets recursively.

      -Lee

      "To be civilized is to deny one's nature."
        Yikes! I just need it to automate some testing, I know what the inputs should be (not large), but I'm trying to be lazy. In trying to be lazy, I spent more time than I would have taken me to type things in by hand. This would make a nice RPC for multiple platforms...(here we go again) Thanks!