Just another Perl shrine  
PerlMonks 
Re: Hanoi Challengeby blokhead (Monsignor) 
on Oct 22, 2004 at 19:10 UTC ( #401639=note: print w/replies, xml )  Need Help?? 
Here's my attempt:
Analysis: In the 3peg version, we reduce the problem of moving N disks to a problem of moving N1 disks. This is because we have only one peg of "scratch" space, and all disks on top of the largest one must go to the "scratch" peg. With more than 3 pegs, we have more scratch space, so we can split the problem up more evenly between the multiple scratch pegs. So this is what we do here. When moving N disks, we split the N1 disks above us as evenly as possible among the available scratch space. (this is the int(($num + $#rest  $i)/@rest) business, it's just a fancy way of splitting up the disks so that if the piles can't be divided exactly evenly, the first piles will get the extras). Then we move the bottom disk to the destination, and move the subpiles back (in reverse order of course!) The problem is assigning the subproblems their scratch space. The trick is that if a subpile was moved after us, it has larger disks than us, and can be used for scratch. But we can't use subpiles that were moved before us, because they contain smaller disks. This is why we have the grep { $_ > $i } @rest. Of course, we can also use the source and destination pegs when appropriate, just like in the 3peg case, so they are added to the scratch space in the recursive call as well. We can get a great improvement from having more pegs: In fact, going from 3 pegs to 4 pegs is the most important, because instead of reducing the problem size by 1, we split it roughly in half every time (having 2 scrach pegs). This takes us from exponential number of moves needed to O(n log n). Then as the number of pegs approaches the number of disks, we approach O(n) number of moves, which makes sense because we only need to move each disk at most twice. blokhead
In Section
Meditations

