Computer Science Canada Programming C, C++, Java, PHP, Ruby, Turing, VB   Username:   Password: Wiki   Blog   Search   Turing   Chat Room  Members
Towers of Hanoi Question
Author Message
whoareyou

Posted: Fri Mar 22, 2013 4:12 pm   Post subject: Towers of Hanoi Question

Hello,

I've been looking through the solution to the Towers of Hanoi problem for a long time, and even tracing the function using the call stack output on http://www.cs.cmu.edu/~cburch/survey/recurse/hanoiex.html.

I understand the first call, MoveTower(5, A, B, C), but in the second call and the calls thereafter, the destination and temporary peg switch. Why is this?

jbking

Posted: Fri Mar 22, 2013 5:16 pm   Post subject: Re: Towers of Hanoi Question

Because to make that move requires one to make other moves first. Remember the rules of which disks can be moved and when.
whoareyou

Posted: Fri Mar 22, 2013 5:27 pm   Post subject: RE:Towers of Hanoi Question

I still don't get it . Can you explain in more detail?
Panphobia

Posted: Sat Mar 23, 2013 1:13 pm   Post subject: Re: Towers of Hanoi Question

move n−1 discs from A to B. This leaves disc n alone on peg A
move disc n from A to C
move n−1 discs from B to C so they sit on disc n
whoareyou

Posted: Sat Mar 23, 2013 6:12 pm   Post subject: RE:Towers of Hanoi Question

I still can't see why the destination and temporary pegs keep switching.
Panphobia

Posted: Sat Mar 23, 2013 6:54 pm   Post subject: Re: Towers of Hanoi Question

 Java: public static void Towers(int n, int from, int to, int temp){         if(n==0)return;         Towers(n-1,from,temp,to);         System.out.println("Move top disc from "+from+" to "+to);         Towers(n-1,temp,to,from);     }

if you passed Towers(3,1,2,3);
it would look like this through the output
 code: Move top disc from 1 to 2 Move top disc from 1 to 3 Move top disc from 2 to 3 Move top disc from 1 to 2 Move top disc from 3 to 1 Move top disc from 3 to 2 Move top disc from 1 to 2

and then like this graphically, with the actual pegs
 code: (0)  _|_         |          |     __|__        |          |    ___|___       |          |   ____|____  ____|____  ____|____ (1.1) |          |          |     __|__        |          |    ___|___      _|_         |   ____|____  ____|____  ____|____ (A -> B) (1.2) |          |          |       |          |          |    ___|___      _|_       __|__   ____|____  ____|____  ____|____ (A -> C) (1.3) |          |          |       |          |         _|_    ___|___       |        __|__   ____|____  ____|____  ____|____ (A -> C) (2.1) |          |          |       |          |         _|_       |       ___|___     __|__   ____|____  ____|____  ____|____ (A -> B) (3.1) |          |          |       |          |          |      _|_      ___|___     __|__   ____|____  ____|____  ____|____ (C -> A) (3.2) |          |          |       |        __|__        |      _|_      ___|___       |   ____|____  ____|____  ____|____ (C -> B) (3.3) |         _|_         |       |        __|__        |       |       ___|___       |   ____|____  ____|____  ____|____ (A -> B)
whoareyou

Posted: Sat Mar 23, 2013 6:58 pm   Post subject: RE:Towers of Hanoi Question

I realize that the algorithm is actually doing that and I can follow what the algorithm is doing. But my question is WHY is it necessary to switch the destination and temporary pegs. I know that it does it in the algorithm, but why does it make sense to do that?
Panphobia

Posted: Sat Mar 23, 2013 7:08 pm   Post subject: RE:Towers of Hanoi Question

Basically, you do not want the exact same peg to keep on having a disc being added to it, that would defeat the purpose of the towers of hanoi, just search on how the Lucas' Tower/Towers of Hanoi is played, you know there are always 2^n-1 amount of moves for the least amount of moves, and to play optimally, what needs to be done? where do the discs need to be put? see if I instead used the function
 code: public static void Towers(int n, int from, int to, int temp){         if(n==0)return;         Towers(n-1,from,to,temp);         System.out.println("Move top disc from "+from+" to "+to);         w++;         Towers(n-1,from,to,temp);     }

with the same values being passed I would get this
 code: Move top disc from 1 to 2 Move top disc from 1 to 2 Move top disc from 1 to 2 Move top disc from 1 to 2 Move top disc from 1 to 2 Move top disc from 1 to 2 Move top disc from 1 to 2