quadrat einer Zahl rekursiv

Status
Nicht offen für weitere Antworten.
B

Bernd82

Gast
Hallo

ich soll ein Programm schreiben das dass Quadrat einer Zahl rekursiv berechnet. Leider komme ich nicht mehr weiter. Der Compiler (nutze BlueJ) meckert folgendes: "Quadrat (int) in Quadratrek cannot be applied to (double) "

keine Ahnung was das bedeuten soll. Ich komme gerade nicht weiter.

Java:
import java.util.Scanner;

public class Quadratrek{
   public static void main(String[] args){
      Scanner scanner = new Scanner(System.in);
      System.out.print("Geben sie die erste Zahl ein: ");
      int a = scanner.nextInt();
      System.out.println("Das Quadrat der Zahl ist:" +  Quadrat(Math.pow((a-1),2)+2*a-1));
   }
   static int Quadrat(int a){
     if(a==0) return a=0;
     else return Quadrat(Math.pow((a-1),2)+2*a-1);
   }
}
 
B

Bernd82

Gast
die rekursive Formel ist folgende:

n² = 0 falls n = 0

n²= (n-1)² + 2n-1 falls n>0
 

eRaaaa

Top Contributor
na die fehlermeldung ist doch eindeutig:
Math.pow liefert halt ein double, deine methode erwartet aber ein int

-->Quadrat(int a)

genauso, beim rückgabewert.
aber bevor du das jetzt zu doulbe umänderst. der weg den du da einschlägst ist nicht der richtige :) du willst ja gerade NICHT Math.pow benutzen. und genau an der stelle wo du das nutzt, musst du halt diene methode aufrufen --> rekursion
 
B

Bernd82

Gast
ok damit wäre beantwortet warum der compiler erstmal meckert.

aber die Formel n²= (n-1)² + 2n-1 falls n>0 ist doch eindeutig (vor?)gegeben.
Ich wüsste jetzt erstmal keinen Weg das zu berechnen ohne Math.pow zu benutzen...
wäre nett wenn mir da jemand nen Tipp geben könnte
 

eRaaaa

Top Contributor
aufruf mittels Quadrat(a);

in deiner methode dann deinen return ersetzen:
Quadrat(a-1)+2*a-1;

und genau das Quadrat(a-1) <-- ist doch jetzt dein (n-1)²
 
B

Bernd82

Gast
ok habe mir jetzt anders beholfen, denn (n-1)² bzw (a-1)² ist ja das gleiche wie ((a-1)*(a-1))

der compiler meckert nun auch erstmal nichtmehr, aber egal welche Zahl ich eingebe es kommt immer 0 raus

Java:
/**
 * Autor: Christian Bartusch
 * Matrikelnummer: 2718844
 * Tutor: Schnurbusch, Matti
 */

import java.util.Scanner;

public class Quadratrek{
   public static void main(String[] args){
      Scanner scanner = new Scanner(System.in);
      System.out.print("Geben sie die erste Zahl ein: ");
      int a = scanner.nextInt();
      System.out.println("Das Quadrat der Zahl ist:" + Quadrat(((a-1)*(a-1))+2*a-1));
   }
   static int Quadrat(int a){
     if(a==0) return a=0;
     else return Quadrat(((a-1)*(a-1))+2*a-1);
   }
}
 

eRaaaa

Top Contributor
hmm..du verstehst den sinn glaub ich noch nicht. du sollst oben beim aufruf nicht
Java:
Quadrat(((a-1)*(a-1))+2*a-1));
aufrufen, sondern einfach nur [c]Quadrat(a);[/c]

und nu musst du dir überlegen wie deine methode aussehen muss, damit du halt das richtige ergebnis geliefert bekommst (die rekursive formel hast du ja schon). eig. hast du schon alles, nur du lässt dich zu sehr von der mathematischen formel irritieren hab ich den eindruck:

Java:
else return Quadrat(((a-1)*(a-1))+2*a-1);
da auch wieder nur aufrufen Quadrat(a-1) +2*a-1;
 
Zuletzt bearbeitet:
B

Bernd82

Gast
so jetzt habe ich es, das Quadrat hat einfach nur gestört und wie du ja schon sagtest die Println ausgabe war auch nicht ganz korrekt. danke erstmal für deine Hilfe.

Java:
import java.util.Scanner;

public class Quadratrek{
   public static void main(String[] args){
      Scanner scanner = new Scanner(System.in);
      System.out.print("Geben sie die erste Zahl ein: ");
      int a = scanner.nextInt();
      System.out.println("Das Quadrat der Zahl ist:" + Quadrat(a));
   }
   static int Quadrat(int a){
     if(a==0) return a=0;
     else return (((a-1)*(a-1))+2*a-1);
   }
}
 

eRaaaa

Top Contributor
und wo ist jetzt die rekursion hin? :D

Java:
	static int Quadrat(int a) {
		if (a == 0)
			return a = 0;
		else
			return Quadrat(a - 1) + a + a - 1;
	}
 

Landei

Top Contributor
Na-hein, das ist nicht rekursiv! Du musst dazu quadrat in quadrat aufrufen:
Java:
static int quadrat(int a){
     return a==0 ? 0 : quadrat(a-1) + a + a - 1;
}

[edit] zu langsam...
 
B

Bernd82

Gast
oha, ja stimmt das wäre nicht rekursiv....passiert wenn man sein Problem nur irgendwie gelöst haben will und völlig die Aufgabenstellung dabei vergisst. Danke für eure Hilfe.

Ein Problem gibt es da noch, wenn ich 9000 oder 10000 eingebe kommt stackoverflow... Wie kann man das denn beheben? mit long habe ich schon probiert, geht nicht.

Java:
import java.util.Scanner;

public class Quadratrek{
   public static void main(String[] args){
      Scanner scanner = new Scanner(System.in);
      System.out.print("Geben sie die erste Zahl ein: ");
      long a = scanner.nextInt();
      System.out.println("Das Quadrat der Zahl ist:" + Quadrat(a));
   }
  static long Quadrat(long a) {
        if (a == 0)
            return a = 0;
        else
            return Quadrat(a - 1) + a + a - 1;
    }
}
 

Painii

Bekanntes Mitglied
Ein Problem gibt es da noch, wenn ich 9000 oder 10000 eingebe kommt stackoverflow... Wie kann man das denn beheben? mit long habe ich schon probiert, geht nicht.

stackoverflow-> kein speicher mehr da
Deine JVM hat keinen Speicher mehr sich zu merken wie oft sie die Funktion aufgerufen hat.
Einen "normalen" Overflow hast du, wenn bei genug großen Zahlen irgendwann wieder was negatives rauskommt (Da wird dir aber keine Exception/Error geworfen).
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben