2016-03-30 48 views
0

Bu, karşılaştığım sorun. IAndroid stackoverflow özyineleme

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

gibi bu astar Özyinelemeyi fark nedeniyle
ThreadID = 1 566 = i bir hata alır adres: Ljava/Util/diziler için çağrı yığın taşması; .checkOffsetAndCount: VIII

int yalnızca 4 bayt kullanmalıdır (2.21 kbaytlık toplam + bağlantılar)

Bu, cpu veya özyineleme kullanarak uygulamayı yasaklayan bir sistem mobil uygulamalar için zor mu? o Özyinelemeyi kullanmak kötü bir fikir, So

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

(en az 4 (hatta 8) görev başına çağıran birlikte) ve CPU kullanımı kısıtlama nelerdir Umarım, Lee algoritma gibi çok daha karmaşık görevler lüzum ?

önceden

Andrey teşekkür ederiz

+0

Ne kadar derinlemesine geçilebilir? – kupihleba

+0

Yığınların 12 kb'ye kadar bir sınırı olduğunu duydum, değil mi? Ancak, yalnızca 2+ kb kullanmış – kupihleba

cevap

0

Sen Özyinelemeyi hiçbir sorun kullanabilirsiniz, ancak tekrarlama sonlandırır ya da sadece çok derin gider asla if (yığının derinliği sen bir dizi sınırı vardır aşma izni yok), gördüğünüz hatayı alacaksınız. Bu bir CPU kullanımı sorunu değil. Eğer eski problemse, bunu düzeltmeniz gerekecek, bu yüzden bitecek. Bu ikinci buysa, çözüm için buraya bakın:

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

+0

Sorun, ne zaman çökeceğini tahmin etmekti. Ve an, öyle olduğunda, çok erken görünüyor. Demek istediğim aramaların ardından ezilmiş olmalı. Yine de, sadece 600'e ulaştım. Daha da az. 600 çağrıdan sonra çökmek normal midir? – kupihleba

+0

Hiç bir fikrim yok üzgünüm. – nasch

0

Özyineleme sorun, Oysa bunu sorun olarak görünüyor uygulamaya yol değildir. Bir özyineleme - Durma noktanız olmalı. Her tekrarlama kullandığınızda, işlev çağrıları yığına kaydedilir. Çok fazla varsa veya asla durmazsa. Yığın taşacak.

Bir özyineleme - normal bir işlevden çok fazla cpu kullanmaz, bazen daha iyi bir çözüm sonra normal bir işlevdir.

+0

Sorun, ne zaman çökeceğini tahmin etmekti. Ve an, öyle olduğunda, çok erken görünüyor. Demek istediğim aramaların ardından ezilmiş olmalı. Yine de, sadece 600'e ulaştım. – kupihleba

+0

600 Bunu düşünmek yeterli ... – 2D3D