//=========================================================================
// Loops vs. Recursion - Recursive methods maintain their states 
//=========================================================================
public class recursionState
{
    public static void main(String[] args)
    {                
        loopState(1);               //using loops
        System.out.println();
        recursionState(1);          //using recursion
    }
    
//=========================================================================
// Using loops - A method is stacked once 
//=========================================================================

    public static void loopState(int iteration)
    {        
        String str = new String("test");
         
        while(iteration <= 10)
        {
            System.out.printf("Looping: Iteration %2d ", iteration);
            System.out.printf(" String reference %x \n", System.identityHashCode(str));
            iteration += 1;
        }

        System.out.printf("End of Loop: \t\t");
        System.out.printf(" String reference %x \n"  , System.identityHashCode(str));
   }
          
//=========================================================================
// Using Recursion - A recursive method is stacked, then unstacked 
//=========================================================================

    public static void recursionState(int iteration)
    {        
        String str = new String("test");

        if (iteration > 10)
            return;                                         //end of recursion                              
        
        System.out.printf("Recursion: Iteration %2d ", iteration);
        System.out.printf(" String reference %x \n"  , System.identityHashCode(str));

        recursionState(iteration+1);                        //recursive call

        System.out.printf("Off stack: Iteration %2d ", iteration);
        System.out.printf(" String reference %x \n"  , System.identityHashCode(str));
    }
}