Array schrittweise vergrößern < Java < Programmiersprachen < Praxis < Informatik < Vorhilfe
|
Status: |
(Frage) beantwortet | Datum: | 00:12 Di 13.11.2012 | Autor: | Maurizz |
Aufgabe | Das Pascalsche Dreieck stellt die Binomialkoeffizenten n graphisch dar. Ihre Methode getNextPascalRow() soll bei jedem Aufruf die jeweils nächste Zeile des Pascaldreiecks beginnen bei [1] zurückgeben, allerdings nur solange jeder einzelne Eintrag in der Zeile noch mit dem Datentyp des zurückzugebenen Arrays darstellbar ist. Sobald letzteres nicht mehr möglich ist, soll die Methode wieder bei [1] beginnen und so einen „unendlichen zirkulären Strom von Pascaldreieck-Zeilen“ bereitstellen. |
Hallo,
meine Frage lautet, ob es möglich ist ein Array Schrittweise zu erhöhen. D.h wenn ich die Methode erneut aufrufe soll er lediglich die Arraylaenge um 1 erhöhen und nicht ein völlig neues erstellen wo die alten Werte nicht mehr vorhanden sind. Jegliche meiner Versuche haben entweder ein komplett neues Array angelegt, oder waren nicht kompilierbar.
Da fällt mir grad ein... es muss doch möglich sein ein Array unbestimmter größe zu erstellen, so dass ich einfach beliebig viele Elemente hinzufügen kann.
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 01:10 Di 13.11.2012 | Autor: | Maurizz |
Gut ich habe vorerst eine Lösung gefunden:
public static int[] getNextPascalRow() {
if (pascal.length < 1)
{
pascal = new int[1];
}
for (p = 0; p < pascal.length; p++)
{
pascal[0] = 1; pascal[pascal.length - 1] = 1;
}
truePascal = pascal.clone();
pascal = new int[p+1];
return truePascal;
}
Jetzt stellt sich natürlich die Frage wie ich die Lücken zwischen den [1].....[1] effektiv auffüllen kann. Ob das wohl am besten rekursiv zu lösen wäre?
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 02:41 Di 13.11.2012 | Autor: | Maurizz |
Das Problem ist gelöst!
public static int pascalscherLueckenfuellerX3000(int[] a) { // Der Name ist Programm
if (truePascal[p-1] + truePascal[p] < 0) // Ueberprueft ob die Addition nach hinten los geht
{
return -1;
}
return truePascal[p-1] + truePascal[p];
}
public static int[] getNextPascalRow() {
for (p = 0; p < dummyPascal.length; p++)
{
if (p == 0 || p == dummyPascal.length - 1)
{
dummyPascal[p] = 1;
} else
{
dummyPascal[p] = pascalscherLueckenfuellerX3000(truePascal);
if (dummyPascal[p] == -1)
{
dummyPascal = new int[1]; // Ist die Addition nach hinten losgegangen muessen wir von vorne beginnen.
return dummyPascal; // Hier darf der dummy mal den truePascal spielen, wenn auch nur fuer eine Runde:)
}
}
}
truePascal = dummyPascal.clone();
dummyPascal = new int[p+1];
return truePascal;
}
|
|
|
|
|
Hallo!
Ich weiß nicht, ob du auf den Datentyp INT festgelegt bist. Ich würde empfehlen, UNSIGNED INT zu nehmen, dadurch verdoppelst du den möglichen Zahlenbereich, und wirst noch eine weitere Zeile berechnen können.
Den Überlauf kannst du dennoch feststellen: Die Summe der beiden Zahlen ist dann kleiner als die beiden Zahlen.
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 14:58 Di 13.11.2012 | Autor: | Valerie20 |
In Java gibt es kein "unsigned".
Valerie
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 15:55 Di 13.11.2012 | Autor: | reverend |
Hallo Valerie,
> In Java gibt es kein "unsigned".
Stimmt. Aber man kann es prima virtuell nachmachen, indem man einfach die passende Konstante addiert oder subtrahiert...
Trotzdem bringt das in der Tat nur eine Zeile mehr, und ein Rekordversuch war in der Aufgabe ja gar nicht gefordert.
Grüße
reverend
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 00:19 Mi 14.11.2012 | Autor: | Valerie20 |
Hi Reverend,
> Aber man kann es prima virtuell nachmachen, indem
> man einfach die passende Konstante addiert oder
> subtrahiert...
Stimmt.
Valerie
|
|
|
|