Maximum berechnen.

hello_autumn

Mitglied
Habe eine Aufgabe wo ich mein Maximum berechnen soll. Also ich gebe viele Zahlen ein und dann soll das Programm die größte Zahl herauspicken und anzeigen. So langsam denke ich verstehe ich die Rekursion... Aber irgendwas stimmt nicht ganz:

Java:
import java.util.Scanner;

public class Maximum{

	public static int maximum(int x, int temp) {
		
		
		if (x==0) {
			return maximum; 
		}
		else if (x>temp) { 
		return temp;
		}
		else {
		return x;
		}
		
	}

	public static void main(String args[]) {
		Scanner scan = new Scanner(System.in);
		
		int x = scan.nextInt();
		int temp = scan.nextInt();
		System.out.println(maximum(x));
	}
}

Irgendwie verstehe ich das nicht, wie ich die weiteren Zahlen verstauen soll. Also dachte ich da an etwas temporäres... Die Variable temp.

Ah ja! Und die 0 soll das Prgramm beenden, also die Eingabe. Deswegen mein if x== 0...
 
Zuletzt bearbeitet:
also für mehr als eine Zahl brauchst du ein Array. Deine Rekursion musst du dann dieses array übergeben.

und für die eingabe von mehren dingen benötigst du eine schleife ... oder eine zweite rekursion ... wobei es mit einer schleife einfacher wäre und ggf. kann es leichter sein, wenn du zunächst eingeben lässt, wie viele zahlen eingegeben werden sollen, damit du die array größe festlegen kannst

... ja das zitat wollte ich zunächst schreiben, aber es geht einfacher ...
du musst deine temp variable ja jedes mal neu einlesen, d.h. diesesmal kommt die abfrage in die rekursion.
 
Okay... jetzt habe ich irgendwie alles kaputt gemacht...

Java:
import java.util.Scanner;

public class Maximum{

	public static int maximum(int x, int temp) {
		
		temp = scan.nextInt();
		
		if (temp == 0) {
			return maximum; 
		}
		else if (x>temp && x>0) { 
		return x;
		}
		else {
		return temp;
		}
		
	}

	public static void main(String args[]) {
		Scanner scan = new Scanner(System.in);
		
		int x = scan.nextInt();
		
		
		System.out.println(maximum(x, scan));
	}
}

Warum kann der beim compilieren die Variable scan.nextInt nicht finden??
 
Weil die Variable scan nur in der main Methode deklariert ist.

Wäre es nicht viel einfacher am Anfang alle Zahlen einzulesen und dann in ein Array/Liste zu packen?
 
Ich hab leider eine Aufgabe, wo ich alle Zahlen ganz einfach eingebe und am Ende kommt dann nur eine Zahl raus. Also die größte. Und Rekursion soll mit rein.

Kann man denn Rekursion und Arrays zusammen packen?
 
Kann man mit Arrays machen. Ich hab dir mal eine Analogie gebastelt. Meine Methode gibt dir den längsten String aus einem Array zurück:

Java:
public class Test {
  public static void main(String... args) {
    String t = "";
    String[] testString = new String[10];
    for (int i = 0; i < testString.length; i++) {
      t += i;
      testString[i] = t;
    }
    for (String s : testString) {
      System.out.println(s);
    }
    System.out.println("- Longest string -");
    System.out.println(longestString(testString));
  }
  
  public static String longestString(String[] array) {
    return longestString(array, 0, null);
  }
  
  private static String longestString(String[] array, int i, String curMax) {
    if (i >= array.length) {
      return curMax;
    }
    if (curMax == null) {
      curMax = array[i];
    } else if (array[i] != null) {
      curMax = curMax.length() >= array[i].length() ? curMax : array[i];
    }
    return longestString(array, i + 1, curMax);
  }
}
 
Dein Programm entspricht nicht ganz dem divide&conquer-Prinzip, Flown.

Bei dem Prinzip geht es darum, etwas komplexes so weit zu vereinfachen, bis man auf einfache Art und Weise das machen kann, was man eigentlich für das Gesamte beabsichtigt. D. h. man müsste gemäß dieses Prinzips das Array so lange reduzieren, bis nur noch ein einziges Element übrig bleibt (das ist die Abbruchbedingung für die Rekursion). Und genau dieses Element wäre dann der erste Maximumwert der Rekursion, der dann von der Methode zurückgegeben wird. Was ich damit sagen will: Das curMax-Argument braucht man nicht.

Aber eigentlich finde ich das ziemlich unsinnig, das rekursiv zu programmieren. Ich vermute, das ist nur zu Übungszwecken, stimmt das? 🙂
 
Zuletzt bearbeitet:
Minzee, hier hat niemals jemand irgendwas von D&C gesagt. Hier geht es einfach nur um die Lösung eines Problems mittels Rekursion.
 
Das kann man sicherlich machen, hat aber mit der Aufgabe hier nichts zu tun. Und dir Vertrauen, werde ich nicht, da ich dich nicht kenne.
 
Ich würde es so machen:
Java:
class Main
{   
   private static int max(int[] values, int i)
   {
      if(i <= 0) // Abbruchbedingung
      {
         return values[0]; // erster Maximum-Wert
      }
      int max = max(values, i - 1);
      return (values[i] > max) ? values[i] : max;
   }
   public static void main(String[] args) 
   {   
      int[] values = {100, 20, 3, 4, 5};
      int max = max(values, values.length - 1);
      System.out.println(max);
   }
}
 
@Minzee:
Mein Programm war nur ein Beispiel für eine schnelle Rekursion, kein Hintergedanken zu Divide&Conquer und es war vor allem eine Analogie!
[edit]Aber was noch wichtiger ist, diese Rekursion ist eine Emulation für eine Schleife mehr nicht.[/edit]

Minzee, was ist wenn dein Array leer ist?
 
Zuletzt bearbeitet:
Weiß nicht. Die Frage ich hatte ich mich zuvor auch gestellt. Wirft man dann eine Exception? Ist nichts da, kann man auch kein max bestimmen, oder?
 
Zuletzt bearbeitet:
Also erst mal danke fürs antworten!
Ich komme leider erst heute wieder zu meinen Aufgaben 🙁 Ich meide diese...

@ minzee: Leider muss ich die Rekursion in der Übung anwenden. Klar könnte ich etwas anderes machen, aber In der Aufgabe will der Prof eine Rekusion. Okay, ich versuche es dann....

Aktuell stehe ich hier:

Java:
import java.util.Scanner;

public class Maximum{

	public static int maximum(int x, int temp, scan) {
		
		temp = scan.nextInt();
		
		if (temp == 0) {
			return x; 
		}
		else if (x>temp && x>0) { 
		return x;
		}
		else {
		return temp;
		}
		
	}

	public static void main(String args[]) {
		Scanner scan = new Scanner(System.in);
		
		int x = scan.nextInt();
		
		
		System.out.println(maximum(x, scan));
	}
}
 
Simple Frage an dich. Musst du jeweils in der Rekursion Zahlen einlesen oder werden die Zahlen per Array an die Rekursion geliefert?
 
Also die Zahlen werden eingelesen. Und das Programm fragt immer weiter. Erst wenn ich meine Zahlen eingebeben habe, dann spuckt der die größte aus.

Verstehe nicht ganz deine Frage.
 
Naja es ist recht ungewöhnlich maximum "online" zu berechnen. Normalerweise will man das Maximum aus einem Bestand (resp. Array) wissen.

Ich helf dir mal ein bisschen weiter:

Java:
public static int maximum(Scanner scanner) {
  int nr = scanner.nextInt();
  if(nr == 0) return Integer.MIN_VALUE;
  int rekResult = maximum(scanner);
  return /*TODO: max zwischen rekResult und nr zrückliefern*/;
}
 

Neue Themen


Zurück
Oben