/*************************************************************************
 * Name:
 * Login:
 * Precept:
 *
 * Description: Four methods, each of which produce a string of N
 * consecutive x's. (e.g., x, xx, xxx, xxxx)
 *
 * Dependencies: Stopwatch.java
 *************************************************************************/

public class Repeat {

    // returns a String of N consecutive x's
    public static String method1(int N) {
        if      (N == 0) return "";
        String temp = method1(N / 2);
        if (N % 2 == 0) return temp + temp;
        else            return temp + temp + "x";
    }

    // returns a String of N consecutive x's
    public static String method2(int N) {
        String s = "";
        for (int i = 0; i < N; i++)
            s = s + "x";
        return s;
    }

    // returns a String of N consecutive x's
    public static String method3(int N) {
        if      (N == 0) return "";
        else if (N == 1) return "x";
        else return method3(N / 2) + method3(N - (N / 2));
    }

    // returns a String of N consecutive x's
    public static String method4(int N) {
        char[] temp = new char[N];
        for (int i = 0; i < N; i++)
            temp[i] = 'x';
        return new String(temp);
    }

    public static void main(String[] args) { 
        int N = Integer.parseInt(args[0]);

        Stopwatch timer = new Stopwatch();
        String s = method4(N);
        // System.out.println(method4(N));
        System.out.println("Elapsed time for method 4 = " + timer.elapsedTime());

        timer = new Stopwatch();
        s = method3(N);
        // System.out.println(method3(N));
        System.out.println("Elapsed time for method 3 = " + timer.elapsedTime());

        timer = new Stopwatch();
        s = method1(N);
        // System.out.println(method1(N));
        System.out.println("Elapsed time for method 1 = " + timer.elapsedTime());

        // You may want to comment out the line "s = method2(N);" to get good
        // timing data for the three other methods above. Why is method2() so
        // much slower than the other three methods?

        timer = new Stopwatch();
        s = method2(N);
        // System.out.println(method2(N));
        System.out.println("Elapsed time for method 2 = " + timer.elapsedTime());
    }
}