Mehrfache Rekursion

vwxxx

Mitglied
Hallo liebes Forum,
ich habe folgende Aufgabe gegeben:
Programmieren Sie eine zweifach rekursive Methode int summe(int[] v, int von, int
bis), die die Summe der Werte im Feld v von Index von bis Index bis berechnet. Ist der
Basisfall erreicht wird der zugehörige Wert zurückgeliefert, sonst wird der Indexbereich
in zwei möglichst gleich große Teilbereiche zerlegt, die Funktion ruft sich selbst für jeden
dieser beiden Teilbereiche auf und verarbeitet die Ergebnisse.
Programmieren Sie eine Applikation, die eine Folge ganzer Zahlen auf der Kommandozeile
übergeben bekommt, diese in einem Feld speichert, das komplette Feld mit der Methode
summe aufsummiert und das Ergebnis ausgibt.


Soweit so gut. Folgenden Code habe ich auch schon geschrieben und ich denke ich bin der Lösung sehr nahe. Jedoch scheint bei mir der Code nicht richtig aufzusummieren (Folge 1 2 3 4 funktioniert aber z.B. Folge 1 2 3 4 5 nicht) und ich bin langsam echt am verzweifeln. Wenn jemand einen Hinweis hat, wieso mein Code nicht genau das macht was er soll wäre ich sehr dankbar:

Java:
public class Rekursion{
    public static int summe (int[] v, int von, int bis ) {  //summe methode
        if (von == bis){ //prüfung ob basisfall erreicht wurde
                               
               return v[von]; //wenn ja dann wird einfach der wert an der stelle von bzw. bis ausgegeben
    }
        else{
        int mitte = (von + bis) / 2; //mitte des arrays wird bestimmt
           
            int linkehaelfte = summe(v, von, mitte); //methode summe wird nocheinmal für linke hälfte und rechte hälfte durchgeführt (array wird halbiert)
            int rechtehaelfte = summe(v, mitte + 1, v.length - 1); //rechte hälfte ist mitte +1 bis zum letzten eintrag des arrays was an stelle folge.length - 1 steht, da folge bei index 0 beginnt
           
            return linkehaelfte + rechtehaelfte;


        }
    }
    public static void main (String[] args){ //main mehtode, es wird davon ausgegangen dass man eine zahlenfolge aufsteigend sortiert bekommt
        int[] folge = new int [args.length]; //array folge wird mit länge von kommandozeilenaeingabe deklariert
       
        for (int i = 0; i < args.length; i++ ){ // array Folge soll mit Zahlen aus der Kommandozeile gefüllt werden,
            folge[i] = Integer.parseInt(args[i]);  // args wird in int umgewandelt vor dem abspeichern in array folge
        }
    for (int i = 0; i < folge.length; i++) {
            System.out.println("Ihre Eingabe ist: " + folge[i]); // Array Folge soll ausgegeben werden als test
    }

        int sum = 0;
        sum = summe(folge,0, folge.length -1); //gesamtes array folge (mit von als erster wert in array folge und bis als letzter wert in array folge) soll mit methode summe (oben definiert) aufsummiert werden
        System.out.println("Summe ist " + sum); //Summe wird ausgegeben
    }
}
 

vwxxx

Mitglied
Bei rechtehaelfte? linkehaelfte geht vom Anfang "von" bis mitte des arrays. Deshalb, müssten die Grenzen für rechtehaelfte doch "mitte +1" bis Ende des arrays, also v.length -1 sein oder nicht? Ich habe auch schon als obere Grenze v.length ohne das "-1" versucht, das gibt aber ein out of bounds error.
 

KonradN

Super-Moderator
Mitarbeiter
Dann spiel es mal durch: Array hat 8 Elemente und von = 0, Ende = 3

Was sind die Grenzen für die zwei Aufrufe?
 

KonradN

Super-Moderator
Mitarbeiter
Ich bin schon etwas weiter … nimm die Parameter, die ich vorgegeben habe. Was sind da die Aufrufe, die du machen musst?

Edit: Tippfehler durch dicke Finger am Smartphone
 

KonradN

Super-Moderator
Mitarbeiter
Nein, du hast den Aufruf, dass der Bereich von 0-3 summiert werden soll. Dann kannst du doch nur diese Grenze betrachten
 

vwxxx

Mitglied
ach so war das gemeint sorry. Die Grenzen wären dann 0,1 und... 2,7? OOOOH liegt es daran, dass ich für rechtehaelfte wahrscheinlich "bis" statt v.length-1 verwenden muss..?!
Edit: Scheint der Fall zu sein. Macht Sinn. Vielen Dank für die Hilfe (hoffe das war alles an Fehlern).
 

KonradN

Super-Moderator
Mitarbeiter
Ja genau, sobald du das geändert hast, sollte es funktionieren. Zumindest sehe ich gerade kein anderes Problem mit deinem Code:
 

Neue Themen


Oben