# Entrekursivierung



## Troubles (21. Mai 2011)

Hallo Leute,

ich hab wieder mal ein knifflige Aufgabe: Und zwar geht es um die Entrekursivierung folgendes Algorithmus.
Aufgabe 1/b
http://www.pervasive.jku.at/Teaching/_2011SS/AlgoPI1/Uebungen/UE07/Algo1_Uebung07.pdf

Diesen Algorithmus hab ich erstellt und getestet (er funktioniert):

```
public static int stirling ( int n,   int k){
		
		if (n==k){
			return 1;
		}
		
		if (k==0 && n>0||n<k){
			return 0;
		} else {
			return stirling (n-1, k-1) + k*stirling(n-1,k);	
		}
		
	}
```

Laut einem Übungsbsp.:http://www.pervasive.jku.at/Teaching/_2011SS/AlgoPI1/Begleitmaterial/Übung/07_Entrekursivierung.pdf
hab ich den Algorithmus in Java Programmiert. Wenn ich den Algorithmus nun teste, komme ich in eine Endlosschleife. 
Zuerst mal mein Kellerspeicher:

```
public class stack {

	// Array anlegen
	static int[] speicher = new int[50];

	static void push(int x) {
		if (speicher[0] == 0) {
			speicher[0] = x;
		} else {
			// Ende suchen
			int i = 0;
			while (speicher[i] != 0) {
				i++;
			}
			speicher[i] = x;
		}
	}

	static int pop() {
		int i = 0;
		int k = 0;

		if (speicher[i] == 0) {
			return speicher[i];
		} else {
			while (speicher[i] != 0) {
				i++;
			}
			k = speicher[i - 1];
			speicher[i - 1] = 0;
			return k;
		}
	}

	static boolean emptyStack() {
		if (speicher[0] == 0) {
			return true;
		} else {
			return false;
		}
	}
}
```

//////////////////
Meine iterative Variant:
/////////////////


```
public class kombinatorik_ohne {

	public static void main(String[] args) {
		int r = 0;
		r = stirling(4, 2);
		System.out.println("Result: " + r);
	}

	public static int stirling(int n, int k) {
		int result = 0;
		int state = 1;
		int w1;
		int w2 = 1;

		while (state != 0) {
			System.out.println(111);
			switch (state) {

			case 1:
				if (n == k) {
					result = 1;
					state = 0;

				} else if (k == 0 && n > 0 || n < k) {
					result=0;
					state=0;
					
				}else{
					stack.push(n);
					stack.push(k);
					n = n - 1;
					k = k - 1;
					state = 1;
				}
				break;
				
			case 2:
				n = stack.pop();
				k = stack.pop();
				w1 = result;
				System.out.println(w1);
				stack.push(w1);
				stack.push(w2);
				n = n - 1;
				state = 1;
				break;
				
			case 3:
				w1 = stack.pop();
				w2 = k * result;
				System.out.println(w2);
				result = w1 + w2;
				state = 0;
				break;
				
			}// switch
			if (state == 0 && !stack.emptyStack()) {
				state = stack.pop();
			}
		}
		return result;
	}

}
```

Könnte auch sein, dass mein Fehler im Kellerspeicher liegt. 

Danke im Voraus für eure Hilfe!

Lg Troubles


----------



## chalkbag (24. Mai 2011)

Morgen,

am leichtesten wäre es sicherlich entweder nach jeder Schleifeniteration den Stack per syso auszugeben, oder wenn möglich mit dem Debugger durchzulaufen und dabei den Stack zu beobachten.

Könnt ich machen, aber könntest du bestimmt auch :bae:

Der Stack sich richtig aus, ich denke eher das nicht jeder State korrekt gesetzt wird.


----------



## Troubles (25. Mai 2011)

Oah hallo 

Hab nach langem suchen den fehler endlich gefunden, neija eigentlich hat meine freundin einen neuen stack aus einer Arraylist gebastelt und es hat auf anhieb funktioniert: 

```
public class stack {

	static ArrayList<Integer> speicher = new ArrayList<Integer>();

	static void push(int x) {

		speicher.add(new Integer(x));
	}

	static int pop() {

		return speicher.remove(speicher.size()-1);
	}

	static boolean emptyStack() {

		return speicher.isEmpty();
	}
}
```

Danke für eure Mühen

Lg nun ohne Troubles


----------

