Aufgabe: overwriteat (List, rekursiv)

Bei Postings zu Aufgabe Nr. x = 1..4 lassen Sie Ihr Betreff bitte mit "x: " beginnen, gefolgt von einer möglichst präzisen Überschrift, danke!

Moderator: Algorithmen und Datenstrukturen

Forumsregeln
Bei Postings zu Aufgabe Nr. x = 1..4 lassen Sie Ihr Betreff bitte mit "x: " beginnen, gefolgt von einer möglichst präzisen Überschrift, danke!
Hallo
Endlosschleifenbastler
Endlosschleifenbastler
Beiträge: 162
Registriert: 22. Apr 2015 19:03

Aufgabe: overwriteat (List, rekursiv)

Beitrag von Hallo »

Hi,

Ich wollte mal fragen ob es so mit der Datenstruktur ListItem<T> funktioniert.

Code: Alles auswählen


	public boolean overwriteat(ListItem<T> list, T elem, int pos){
	
	return overwriteatRec(list, elem, pos, 0);
	
	
	}
	
	public boolean overwriteatRec(ListItem<T> list, T elem, int pos, int i){
	
	if(list == null){
	return false;}
	
	if(i==pos){
	list.key = elem;
	return true;
	}
	return overwriteatRec(list.next, elem, pos, i++);
	
	}
	
Zuletzt geändert von Hallo am 30. Aug 2016 16:39, insgesamt 1-mal geändert.

joshimoo
Windoof-User
Windoof-User
Beiträge: 29
Registriert: 25. Apr 2015 17:16

Re: Aufgabe: overwriteat (List, rekursiv)

Beitrag von joshimoo »

Hab mir den Kontext ListItem<T> nicht angeschaut:

aber ich denke:

Code: Alles auswählen

   list.key = i; 
sollte wohl:

Code: Alles auswählen

  list.key = elem; 
sein?

Ausserdem kannst du den extra i parameter weglassen indem du:
pos-- in jeder rekursion machst und dann den Rekursionsanker pos == 0 nimmst ;)
Dadurch sparst du dir auch die zusätzliche Start Methode, falls du magst :)

also dann so: (nicht getestet und im Browser geschrieben)

Code: Alles auswählen

   public boolean overwriteat(ListItem<T> list, T elem, int pos) {
   	if(pos < 0 || list == null) { return false; }
   	if(pos == 0) {
   		list.key = elem;
   		return true;
   	}
   	
   	return overwriteat(list.next, elem, pos - 1);
   }

Hallo
Endlosschleifenbastler
Endlosschleifenbastler
Beiträge: 162
Registriert: 22. Apr 2015 19:03

Re: Aufgabe: overwriteat (List, rekursiv)

Beitrag von Hallo »

Hi !
Ja das sollte schon so sein, Denkfehler :oops: :P
(Habe den Fehler jetzt auch korrigiert in dem Code oben ;) )


Diese Lösung habe ich nachdem ich meine Lösung in dieser PDF gefunden. Mir fällt es aber leichter eine 2. Methode da zu schreiben :P Keine Ahnung warum..
Aber so ist es doch auch okay, oder nicht?

joshimoo
Windoof-User
Windoof-User
Beiträge: 29
Registriert: 25. Apr 2015 17:16

Re: Aufgabe: overwriteat (List, rekursiv)

Beitrag von joshimoo »

ist absolut okay mit extra Start Methode.

ich würde noch den Fall das die übergebene Position im negativen Bereich ist behandeln.

Code: Alles auswählen

 if(pos < 0 || list == null) { return false; } 
Ausser es ist in der Spezifikation angegeben, das die indexe auch Negativ sein können.

Hallo
Endlosschleifenbastler
Endlosschleifenbastler
Beiträge: 162
Registriert: 22. Apr 2015 19:03

Re: Aufgabe: overwriteat (List, rekursiv)

Beitrag von Hallo »

Danke für deine Hilfe ! :wink:

Kennst du dich vielleicht auch mit der Insert Methode aus ? Die in der PDF macht irgendwie kein Sinn für mich..
Mein Code sieht dafür so aus, jedoch für PartiallyUsedArray..Bin mir aber ziemlich unsicher, ob das irgendwie funktionieren wird.

Code: Alles auswählen

public void insert(PartiallyUsedArray<T> array, T elem, Comparator<T> cmp){
	
	if(array==null){
	return;}
	
	for(int i =0;i <array.NumberOfUsedSlots; i++){
		
		if(cmp.compre(array.theArray[i], elem) >0 ){
		
		//Jedes Element ab dem i-ten Element eins nach rechts rücken, um Platz für das neue Element zu machen.
		for(int j=i; i< array.NumberOfUsedSlots; j++){
		
		int tmp = array.theArray[j+1];
		array.theArray[j+1] = array.theArray[j];
		int tmp2 = array.theArray[j+2];
		array.theArray[j+1] = tmp;
	
		}
		
		array.theArray[i]= elem;
		array.numberOfUsedSlots ++;
		
		}
		
		
	
	}

Antworten

Zurück zu „AuD: Programmieraufgaben“