Java: Wie programmiert man so etwas?

3 Antworten

Hier wird von "schicken Lösungen" gesprochen ohne Bitshift operator zu verwenden. Unglaublich.

Für Zweierpotenzen bis 10:

for (int i = 0; i < 11 ; i++) {
  System.out.println(1 << i);
}

Besser wäre hier natürlich noch einen String Builder oder so zu verwenden und println nur ein mal aufzurufen aber naja. Denke das Konzept ist klar.

Woher ich das weiß:Berufserfahrung – Software Entwickler / Devops

Die "schicke Lösung ist": Du schreibst Dir zunächst eine Methode "zweierpotenz", welche ausrechnen kann, wieviel 2^n ist für ein gegebenes n und diesen Wert als int liefert.

int zweierpotenz(int n) {
  return ...; // eben 2^n
}

Dann rufst Du diese Methode in einer Schleife innerhalb der Methode "zweierpotenzen" auf und gibst das Ergebnis aus:

void zweierpotenzen(int n) {
  for (int i = 0; i <= n; i++)
  {
    int ergebnis = zweierpotenz(i);
    System.out.println(...);
  }
}

Die schnelle Lösung ist:

int ergebnis = 1;
for (int i = 0; i <= n; i++) {
  System.out.println(...);
  ergebnis *= 2;
}

Hierbei ist "ergebnis" nach der Schleife aber 2^(n+1)!!


BeamerBen  22.11.2021, 14:44

Also bitte, für zweierpotenzen eine Extra Funktion schreiben? Das ist doch lächerlich. Schreibst du auch Funktionen um z.B. + 5 zu addieren?

0
ohwehohach  22.11.2021, 14:46
@BeamerBen

Vielleicht geht es in der Übung ja genau darum, dass er es mal zu Fuß ausprogrammieren soll?

Ich würde das so auch nicht machen - ich würde allerdings diese Aufgabe komplett nicht programmieren, weil's eine Anfängerübung ist, die ich definitiv nicht mehr nötig habe.

Ich halt es eher für lächerlich, einem kompletten Anfänger mit Bitshifting zu kommen und zu erwarten, dass er damit was anfangen kann...

0
ohwehohach  22.11.2021, 14:50
@ohwehohach

(Es hindert ihn übrigens niemand, nach dem "return" in meiner ach so überflüssigen Funktion einfach "1 << n" hinzuschreiben)

0
BeamerBen  22.11.2021, 14:53
@ohwehohach

Bitshift Operator sind nicht kompliziert wenn man das Binärsystem versteht. Außerdem gibt es ja andere Lösungswege, ich hab eben nur den ergänzt der noch nicht genannt wurde. Sonst hätte ich andere auch vorgeschlagen.

Ob du die Aufgabe machen würdest oder nicht ist doch völlig egal, das ist halt die Aufgabe.

Aber unabhängig davon ob man jetzt der Lesbarkeit halber eine Extra Variable nimmt, *2 oder bitshift nutzt ist es eben total Sinnbefreit für so was eine Funktion anzulegen und das bringt halt auch einem Anfänger nichts. Die lernen dadurch erst recht nicht wann man eine Funktion anlegen sollte und wann nicht und das ist ein häufiges Problem bei denen.

0
ohwehohach  22.11.2021, 14:59
@BeamerBen

Dann könntest Du genauso argumentieren, dass es Blödsinn ist, für die gewünschte Funktion "zweierpotenzen" eine separate Funktion anzulegen, denn ob es guter Stil ist, solch eine Funktion rechnen UND ausgeben zu lassen, kann man diskutieren.

Ob du die Aufgabe machen würdest oder nicht ist doch völlig egal, das ist halt die Aufgabe.

Du hattest mich gefragt, ob ich auch für eine simple Addition eine eigene Funktion machen würde. Das war meine Antwort.

Gegenfrage: Wenn es jetzt nicht um Zweierpotenzen sondern um Fibonacci-Zahlen gehen würde - würdest Du meinen Ansatz dann auch lächerlich machen wollen?

Ich habe extra und in voller Absicht hier eine Funktion verwendet, nämlich um klar zu machen, dass Funktionen eben Ergebnisse liefern und dass es häufig eine gute Idee ist, die Berechnung von der Ausgabe zu trennen.

Mir ist schon klar, dass das alles easy ist, wenn man das Binärsystem versteht und so. Aber das "Level of proficiency" kann man sehr schön an der Aufgabenstellung ablesen.

0
weiß jemand bei dieser Aufgabe ein Lösungsvorschlag? Weiß nicht wie ich da vorgehen soll.

Schreibe eine Schleife und nutze eine Variable, die du davor erstellst. In der Schleife multiplizierst du diese einfach immer mit 2