# binsuchrek



## Maximaltime (4. Jul 2011)

danke für die Hilfe bei fakultätrek habs soweit hinbekommen

nun bekomm ich bei binsuchrek in zeile 15 wieder missing return statement weiß aber nicht was ich verändern soll.


```
public class binsuchrek{


	public static int binsuchrekursiv(int [] o,int p,int l,int r){

	int links=0;
	int rechts=o.length;
	int mitte=0;

	if(links<=rechts){
		mitte=(links+rechts)/2;
		if(p<o[mitte])return binsuchrekursiv(o,p,l,mitte);
		else if(p>o[mitte])return binsuchrekursiv(o,p,mitte,r);
		else return mitte;}
	}







	public static void main(String[]args){

	int []	f={1,4,6,9,10,12,54,56,75,675,4311};
	int 	k= 56;
	int links= 0;
	int rechts= f.length;
	int stelle=binsuchrekursiv(f,k,links,rechts);
	System.out.println(k+"=k steht an der "+stelle+"-ten Stelle");

	}
}
```


----------



## Marcinek (4. Jul 2011)

http://www.java-forum.org/chat-nopaste/4714-missing-return-statement.html


----------



## SlaterB (4. Jul 2011)

ein Link auf das vorherige, auch angesprochene, Thema ginge genauso: 
http://www.java-forum.org/hausaufgaben/121058-fakultaet-rekusriv.html

es ist wieder exakt dasselbe, nicht in allen if/else-Fällen ist ein return angegeben,
zur Sicherheit kann auch einfach ganz am Ende noch eins stehen oder

throw new RuntimeException("hier sollte die Ausführung gar nicht hinkommmen");


----------



## Maximaltime (4. Jul 2011)

hab das nun behoben compiler meckert nichtmehr aber wenn ich das programm starte öffnet sich ne endlosschleife von befehlen: at binsuchrek.binsuchrekursiv<binsuchrek.java:13>


----------



## SlaterB (4. Jul 2011)

weil du dein Programm so programmiert hast dass die Methode immer wieder aufgerufen wird,
gib dir zu Beginn der Methode jeweils die Parameter mit System.out.println() aus, dann siehst du was immer gleich bleibt

evtl. siehst du gar nichts unter Unmengen an Ausgaben und dann noch langer Fehlermeldung,
dann merke dir als weiteres Werkzeug:
[c]try{ Thread.sleep(1000); } catch(Exception e) {}[/c]
wartet 1 sec, verringert also die Ausgaben direkt hintereinander, und bis zur Exception wirds ne Stunde dauern

edit:
wahrscheinlich muss rechts doch größer als links sein oder so


----------



## Maximaltime (4. Jul 2011)

hätte jetzt gesagt das das problem int mitte=0 ist weiß aber nicht wie ich das jetzt umändern soll das es klappt..


----------



## Maximaltime (4. Jul 2011)

habs hinbekommen nun



```
public class binsuchrek{


	 public static int binsuchrekursiv(int [] o,int p,int l,int r){


try{ Thread.sleep(1000); } catch(Exception e) {}

System.out.println(p+" =p "+l+" =l "+r+" r ");

	if(l<=r){
		int mitte=(l+r)/2;
		if(p<o[mitte])return binsuchrekursiv(o,p,l,mitte);
		else if(p>o[mitte])return binsuchrekursiv(o,p,mitte,r);
		else return mitte;}
		else return -1;
	}







	public static void main(String[]args){

	int []	f={1,4,6,9,10,12,54,56,75,675,4311};
	int 	k= 56;
	int links= 0;
	int rechts= f.length;
	int stelle=binsuchrekursiv(f,k,links,rechts);
	System.out.println(k+"=k steht an der "+stelle+"-ten Stelle");

	}
}
```


----------



## SlaterB (4. Jul 2011)

wie kommst du denn zu dieser Vermutung?

hier eine einfachere Liste zum Testen: int[] f =  {1};
immer noch Exception

geh doch Schritt für Schritt durch (und danach mit langsam längeren Listen), zu jeder neuen Methodenausführung: 
- feststellen was die Parameter sind, evtl. ausgeben,
- entscheiden ob ein rekursiver Aufruf nötig ist, welche Bedingung gilt dafür?, 
sage nicht 'links <= rechts', sondern sinnvolle Sätze in deutsch, 
wenn du das Verfahren nicht kannst, dann kannst du es auch kaum programmieren, oder?
Bedingung prüfen, evtl. ausgaben
- falls keine Rekursion oder ansonsten vielleicht auch zusätzlich weitere Bearbeitungsschritte ausführen usw.

wie würdest du es auf dem Papier machen?

edit: wenn fertig, umso besser, obwohl der Code für mich nicht richtig aussieht, 
siehe Beispiel mit Liste {1}


----------

