/*
 * Aufgabe 24:
 * -----------
 *
 * Betrachten Sie die folgende Funktionsdefinition:
 *
 *				/ y + 1, falls x = y
 *	f: Z x Z -> Z, (x,y) -> |
 *				\ f(x,f(x-1, y+1)), sonst
 *
 * Hierbei sei Z die Menge der ganzen Zahlen. Bearbeiten Sie nun die
 * folgenden Aufgaben:
 *
 *	a) Implementieren Sie die Funktion in Java, verwenden Sie hierbei
 *	   den Datentyp int zur Modellierung der Menge Z.
 *
 *	b) Untersuchen Sie das Terminierungsverhalten der Funktion f in
 *	   Abhängigkeit von x und y. Gehen Sie hierbei wie folgt vor:
 *
 *		1) Testen Sie (von Hand oder mit Hilfe Ihrer Implementierung),
 *		   welcher der folgenden Aufrufe terminiert.
 *
 *			f(1,1), f(1,2), f(2,1), f(1,3), f(3,1), f(4,8),
 *			f(8,2), f(9,1)
 *
 *		2) Geben Sie an, welcher Wert im Falle der Terminierung zurück
 *		   geliefert wird.
 *
 *		3) Stellen Sie anhand Ihrer Beobachtungen aus 1) und 2) eine
 *		   Vermutung auf, und versuchen Sie, diese durch geschickte
 *		   Argumentation zu begründen. (Es ist kein Beweis gefordert!)
 *
 * Terminierung:
 * -------------
 *
 *	f(1,1):	Terminiert mit Rückgabewert 2, da 1 == 1
 *	f(1,2):	Terminiert nicht, da 1 < 2
 *	f(2,1):	Terminiert nicht, da (2 - 1) % 2 != 0
 *	f(1,3):	Terminiert nicht, da 1 < 3
 *	f(3,1):	Terminiert mit Rückgabewert 4, da (3 - 1) % 2 == 0
 *	f(4,8):	Terminiert nicht, da 4 < 8
 *	f(8,2):	Terminiert mit Rückgabewert 9, da (8 - 2) % 2 == 0
 *	f(9,1):	Terminiert mit Rückgabewert 10, da (9 - 1) % 2 == 0
 *
 * Vermutung:
 * ----------
 *
 *	x == y:	terminiert mit y + 1 als Rückgabe
 *
 *	x < y:	terminiert im "Normalfall" nicht (Überlauf des Stapelspeichers)
 *
 *	x > y:	terminiert falls (x - y) % 2 == 0, Rückgabewert dann y + 1
 */
public class Aufgabe24
{
	private static int f(int x, int y)
	{
		return ((x == y) ? y + 1 : f(x, f(x - 1, y + 1)));
	}

	public static void main(String[] argv)
	{
		System.out.println(f(1, 1));
	}
}

