2017-10-01 15 views
1

元のarraylistに元の要素を追加しようとしています。例えば[1,2,3]は[1,1,2,4,3,9]になるはずです。私の問題は、メモリ不足のエラーが発生しているため、マシンがひどい場合にはわかりません。ここに私の試みです。再帰呼び出しは、arraylistの合計を取得するだけです。ArraylistにArraylistの四角形要素を追加する

public static int sumOfSquares(List<Integer> num) { 


    if (num.isEmpty()) { 
     return 0; 
    } 
    for(int i=0; i<num.size();i++){ 
     int hold= num.get(i)*num.get(i); 
     num.add(hold); 
    } 


    return num.get(0) + sumOfSquares(num.subList(1, num.size())); 
} 
+0

あなたの 'for'ループは' num'に追加するので無限ループです。これは 'size()'を増やしてループを終わらせないようにします。 – 4castle

+0

はそれぞれのループにとってより良いでしょうか? –

+0

あなたはおそらくそれを行うべきではありません。なぜ正方形の合計を得るためにリストを突然変異させるのですか?それが必要な場合は、手順を分けてください。 – ChiefTwoPencils

答えて

1

実装上の問題は、以前に追加した正方形と元の数を区別しないことです。

まず、これを再帰的に実行しているので、forループは必要ありません。各呼び出しは、リストの最初の値だけを処理する必要があります。

次に、add(n)は最後に数字を追加します。例では、元の値の直後に数字を追加しています。したがって、num.add(1, hold)を使用し、再帰呼び出しを行うときは2つの初期番号をスキップする必要があります。ここで

は固定方法がどのように見えるべきかです:

public static int sumOfSquares(List<Integer> num) { 
    if (num.isEmpty()) { 
     return 0; 
    } 
    // Deal with only the initial element 
    int hold= num.get(0)*num.get(0); 
    // Insert at position 1, right after the squared number 
    num.add(1, hold); 
    // Truncate two initial numbers, the value and its square: 
    return num.get(1) + sumOfSquares(num.subList(2, num.size())); 
} 

Demo.

0

それを反復しながら、安全に、リストに要素を追加(または削除)する方法は2つあります。

  1. 次の要素のインデックスがシフトしないように、リストの上に逆方向に反復します。

  2. IteratorまたはListIteratorを使用してください。

いずれの方法でもコードを修正できますが、わかりやすいコードにはListIteratorを推奨します。再帰がリストに正方形の挿入を妨げないように

import java.util.ListIterator; 

public static void insertSquares(List<Integer> num) { 
    ListIterator<Integer> iter = num.listIterator(); 
    while (iter.hasNext()) { 
     int value = iter.next(); 
     iter.add(value * value); 
    } 
} 

そして、別のメソッドに加算コードを移動します。あなたの再帰的な解法はうまくいくが、反復的な解法はJavaにとってより効率的である。

関連する問題