2016-01-18 91 views
0

我有一個LinkedList <點>點,隨機值:動態嵌套循環與動態範圍

10,20 
15,30 
13,43 
    . 
    . 

我想執行這樣的循環:

for (int i= points.get(0).x; i< points.get(0).y; i++){ 
    for (int j= points.get(1).x; j< points.get(1).y; j++){ 
    for (int k= points.get(2).x; k< points.get(2).y; k++){ 
         ... 
         ... 
    } 
    } 
} 

我怎麼能這樣做如果我不知道列表的大小?

+1

你能解釋循環背後的邏輯,而不是分析它應該做什麼嗎?而且,我不知道最終應該做什麼。 – SomeJavaGuy

+4

我同意我們需要更多關於您實際嘗試實現的信息。你的代碼看起來像是最終有n個嵌套的循環,這是一個可以快速殺死你的應用程序的接收器(你的示例值本身會導致4500次迭代,並且這裏x和y之間的差別很小)。 – Thomas

+0

看起來你正在做的事情會導致堆棧溢出/內存不足。你可能試圖單獨運行循環,而不是嵌套?這可以通過點數列表來實現。 – Danielle

回答

1

可能有更好的方法來解決像cpu和內存消耗較少的方程式,但像你的那樣的蠻力方法可以通過遞歸或一些輔助結構來實現以跟蹤狀態。

遞歸,你可以做這樣的:

void permutate(List<Point> points, int pointIndex, int[] values) { 
    Point p = points.get(pointIndex); 
    for(int x = p.x; x < p.y; x++) { 
    values[pointIndex] = x; 

    //this assumes pointIndex to be between 0 and points.size() - 1 
    if(pointIndex < points.size() - 1) {   
     permutate(points, pointIndex + 1; values); 
    } 
    else { //pointIndex is assumed to be equal to points.size() - 1 here 
     //you have collected all intermediate values so solve the equation 
     //this is simplified since you'd probably want to collect all values where the result is correct 
     //as well as pass the equation somehow 
     int result = solveEquation(values); 
    } 
    } 
} 

//initial call 
List<Point> points = ...; 
int[] values = new int[points.size()]; 
permutate(points, 0, values); 

這將首先遍歷使用遞歸調用,並通過一個推動點指數,直至到達列表的末尾點列表。每次遞歸調用將迭代點值並將當前值添加到相應位置的數組中。這個數組然後用來計算方程結果。

請注意,這可能會導致巨大的方程(「巨大」取決於環境的含義,但通常在幾千個點)的堆棧溢出。如果您檢查所有非平凡情況下的所有排列,性能可能爲真的爲

+0

謝謝,這真的很有幫助。 CHEARS – dirac