# quadrat einer Zahl rekursiv



## Bernd82 (21. Nov 2009)

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.


```
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);
   }
}
```


----------



## Bernd82 (21. Nov 2009)

die rekursive Formel ist folgende:

n² = 0  falls n = 0

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


----------



## eRaaaa (21. Nov 2009)

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


----------



## Bernd82 (21. Nov 2009)

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


----------



## Painii (21. Nov 2009)

Bernd82 hat gesagt.:


> 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


Das soll deine Methode quadrat machen.


----------



## eRaaaa (21. Nov 2009)

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)²


----------



## Bernd82 (22. Nov 2009)

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


```
/**
 * 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 (22. Nov 2009)

hmm..du verstehst den sinn glaub ich noch nicht. du sollst oben beim aufruf nicht

```
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:


```
else return Quadrat(((a-1)*(a-1))+2*a-1);
```
da auch wieder nur aufrufen *Quadrat(a-1)* +2*a-1;


----------



## Bernd82 (22. Nov 2009)

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. 


```
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 (22. Nov 2009)

und wo ist jetzt die rekursion hin?  


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


----------



## Landei (22. Nov 2009)

Na-hein, das ist nicht rekursiv! Du musst dazu quadrat in quadrat aufrufen:

```
static int quadrat(int a){
     return a==0 ? 0 : quadrat(a-1) + a + a - 1;
}
```

[edit] zu langsam...


----------



## Bernd82 (22. Nov 2009)

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.


```
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 (22. Nov 2009)

Bernd82 hat gesagt.:


> 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).


----------

