
public class Hauptklasse {

	private Hauptklasse() {
	}

	// 1 1 2 3 5 8 13 21 34 55 89
	// iterativ
	private void fibonacci() {
		long a = 1;
		long b = 1;
		long c = 0;
		System.out.println(a);
		System.out.println(b);
		int n = 50;

		for (int i = 0; i < n - 2; i++) {
			c = a + b;
			a = b;
			b = c;
			System.out.println(c);
		}

	}

	// 1 1 2 3 5 8 13 21 34 55 89
	// 1 2 3 4 5 6 7 8 9 10 11
	// diese Funktion berechnet die i-te Fibonacci-Zahl
	private long calcFiboNumber(long i) {
		// 8 = 5 + 3
		// fibo(6) = fibo(5) + fibo(4)
		// calcFiboNumber(n) = calcFiboNumber(n-1) + calcFiboNumber(n-2)
		if (i < 3) {
			// System.out.println(1);
			return 1;
		} else {
			long result = calcFiboNumber(i - 1) + calcFiboNumber(i - 2);
			// System.out.println(result);
			return result;
		}
	}

	private void fibonacciRekursiv() {
		long n = 50;
		System.out.println("rekursiv");
		long result = calcFiboNumber(n);
		System.out.println(result);
	}

	/*
	 * 0123456789 abcdefghij rev. 9876543210
	 */
	private void reverseABC() {
		System.out.println("\n\nreverseABC");
		String s = "abcdef";
		String sNeu = ""; // fedcba s.charAt(i)

		// neuer Index = (Länge-1) - alterIndex

		// 0 = charAt( (n-1) - 0)
		// 9 = charAt( (n-1) - 9)

		int n = s.length();
		for (int i = 0; i < n; i = i + 1) {
			sNeu = sNeu + s.charAt((n - 1) - i);
		}
		System.out.println("String: " + s);
		System.out.println("ReverseString: " + sNeu);
		sNeu = "";
		for (int i = n - 1; i >= 0; i = i - 1) {
			sNeu = sNeu + s.charAt(i);
		}
		System.out.println("String: " + s);
		System.out.println("ReverseString: " + sNeu);
	}

	/*
	 * calcSRev("abc",i) return s.charAt(i) + calcSRev("abc",i-1)
	 * 
	 * calcSRev("abc",2) return "c" + calcSRev("abc",1)
	 * 
	 * calcSRev("abc",1) return "b" + calcSRev("abc",0)
	 * 
	 * calcSRev("abc",0) return "a"
	 */
	// die Methode nimmt das Character an der i-ten Position
	// UND ruft rekursiv die Methodeauf mit i-1
	private String calcReverseABCRekursiv(String s, int i) {
		if (i == 0) {
			return "" + s.charAt(i);
		} else {
			return s.charAt(i) + calcReverseABCRekursiv(s, i - 1);
		}
	}

	private void reverseABCRekursiv() {
		System.out.println("\n\nreverseABC");
		String s = "abcdef";
		String sNeu = calcReverseABCRekursiv(s, s.length() - 1);
		System.out.println("Rekursiv: " + sNeu);
	}

	private void calcReverseNumber() {
		System.out.println("\n\ncalcReverseNumber");
		int zahl = 12345;
		int zahlNeu = 0;
		// 123 ==> 321 = 3*100 + 2*10 1*1
		// 123%10 = 3
		int z = zahl; // Originalzahl soll erhalten bleiben!
		while (z > 0) { // z=123 zahlNeu=4
			int rest = z % 10; // 3
			int div = z / 10; // 12 zahlNeu wird nun zu 43
			zahlNeu = zahlNeu * 10 + rest; // "43"
			z = div; // neues z
		}
		System.out.println("Zahl: " + zahl);
		System.out.println("ReverseNumber: " + zahlNeu);
	}

	// Beispiel 123 => 1000 1234 ==> 10000
	private int powerNumber(int zahl) {
		int x = 1;
		while (zahl > x * 10) {
			x *= 10;
		}
		return x * 10;
	}

	// zahl=123 => return 3 + calcReverseNumberRekursiv(12)
	private int calcReverseNumberRekursiv(int zahl) {
		if (zahl < 10) {
			return zahl;
		} else {
			int rest = zahl % 10; // 3
			int div = zahl / 10; // 12 zahlNeu wird nun zu 43
			return rest*powerNumber(div) + calcReverseNumberRekursiv(div);
		}
	}
	private void calcReverseRekursivNumber() {
		System.out.println("\n\ncalcReverseRekursivNumber");
		int zahl = 12345;
		int zahlNeu = calcReverseNumberRekursiv(zahl);
		System.out.println("Zahl: " + zahl);
		System.out.println("ReverseNumberRekursiv: " + zahlNeu);
	}

	public static void main(String[] args) {
		Hauptklasse instanz = new Hauptklasse();
		// instanz.fibonacci();
		// instanz.fibonacciRekursiv();
		// instanz.reverseABC();
		// instanz.reverseABCRekursiv();
		//instanz.calcReverseNumber();
		instanz.calcReverseRekursivNumber();
	}

}
