2016-03-30 9 views
0

das ist das Problem, das ich lief. Ich habe das liner Rekursion bemerkt wieAndroid stackoverflow Rekursion

public void memtest(int i){ 
Log.d("memory", i + ""); memtest(i+1);} 

erhält einen Fehler auf i = 566 wegen der
threadid = 1: Stapelüberlauf auf Abruf Ljava/util/Arrays; .checkOffsetAndCount: VIII

int sollte nur 4 Bytes (2,21 kbytes insgesamt + Links) verwenden

Ist es ein System, das App mit CPU oder Rekursion verbietet, ist zu schwer für mobile Apps? Hoffentlich muß ich viel komplizierte Aufgaben wie Lee-Algorithmus (mit mindestens 4 (auch 8) pro Aufgabe nennt)

protected void volna(int x, int y, int k) { 
    field[x][y] = k; 
    if ((x != finx) & (y != finy)) { 
     if ((x > 0) && (field[x - 1][y] == 0)) volna(x - 1, y, k + 1); 
     if ((x < map.getWidth()) && (field[x + 1][y] == 0)) volna(x + 1, y, k + 1); 
     if ((y > 0) && (field[x][y - 1] == 0)) volna(x, y - 1, k + 1); 
     if ((y < map.getHeight()) && (field[x][y + 1] == 0)) volna(x, y + 1, k + 1); 
    } 

So ist es eine schlechte Idee Rekursion zu verwenden und welche Einschränkungen der CPU-Auslastung ?

Vielen Dank im Voraus,

Andrey

+0

Wie tiefe Rekursion kann gehen? – kupihleba

+0

Ich habe gehört, dass Stacks eine Grenze von etwa 12 kb hat, oder? Aber es hat nur 2+ kb – kupihleba

Antwort

0

Sie können Rekursion kein Problem, verwenden aber wenn die Rekursion beendet nie oder einfach zu tief geht (die Tiefe des Stapels hat eine festgelegte Grenze, die du bist nicht überschreiten dürfen), erhalten Sie den Fehler, den Sie sehen. Es ist kein CPU-Auslastungsproblem. Wenn es das frühere Problem ist, müssen Sie es offensichtlich reparieren, damit es endet. Wenn es Letzteres ist, sehen Sie hier eine Lösung:

https://en.wikipedia.org/wiki/Stack_overflow#Very_deep_recursion

+0

Das Problem war zu schätzen, wann es abstürzt. Und der Moment scheint zu früh zu sein. Ich meine, es hätte nach Tausenden von Anrufen zerschlagen werden sollen. Aber ich habe nur 600 erreicht. Noch weniger. Ist es normal, nach 600 Anrufen zu stürzen? – kupihleba

+0

Ich habe keine Ahnung, sorry. – nasch

0

Rekursion ist nicht das Problem, Doch so, wie Sie es implementiert scheint das Problem zu sein. Eine Rekursion - Muss einen Haltepunkt haben. Jedes Mal, wenn Sie eine Rekursion verwenden, werden die Aufrufe der Funktionen im Stapel registriert. wenn es zu viele gibt oder es nie aufhört. Der Stapel wird überlaufen.

Eine Rekursion - verwendet nicht zu viel CPU nicht mehr als eine normale Funktion, manchmal ist es sogar eine bessere Lösung als eine normale Funktion.

+0

Das Problem war zu schätzen, wann es abstürzt. Und der Moment scheint zu früh zu sein. Ich meine, es hätte nach Tausenden von Anrufen zerschlagen werden sollen. Aber ich habe nur 600 erreicht. – kupihleba

+0

600 Ist genug davon zu denken ... – 2D3D