0

このコードを再度投稿して申し訳ありません。以前の問題は、int の代わりに long を使用することで修正されたスタック オーバーフロー エラーが発生したことでした。ただし、n の値が大きい場合、スレッド "main" java.lang.OutOfMemoryError: Java heap space で例外が発生しました。質問:

Given a positive integer n, prints out the sum of the lengths of the Syracuse 
sequence starting in the range of 1 to n inclusive. So, for example, the call:
lengths(3)
will return the the combined length of the sequences:
1
2 1
3 10 5 16 8 4 2 1 
which is the value: 11. lengths must throw an IllegalArgumentException if 
its input value is less than one.

私のコード:

  import java.util.*;


  public class Test {

HashMap<Long,Integer> syraSumHashTable = new HashMap<Long,Integer>();

public Test(){

}

public int lengths(long n)throws IllegalArgumentException{

    int sum =0;

    if(n < 1){
        throw new IllegalArgumentException("Error!! Invalid Input!");
    }   

    else{

        for(int i=1;i<=n;i++){
            sum+=getStoreValue(i);
        }
        return sum;


    }


}

private int getStoreValue(long index){
    int result = 0;

    if(!syraSumHashTable.containsKey(index)){
        syraSumHashTable.put(index, printSyra(index,1));
    }

    result = (Integer)syraSumHashTable.get(index);

     return result;

}

public static int printSyra(long num, int count) {
    if (num == 1) {
        return count;
    }
    if(num%2==0){

        return printSyra(num/2, ++count);
    }

    else{

        return printSyra((num*3)+1, ++count) ;

    }
}


}

前の数値の合計に追加する必要があるため、スレッド "main" java.lang.OutOfMemoryError: Java heap space for a huge value n. で例外が発生します。ハッシュテーブルが計算の高速化に役立つと思われることは知っています。HashMap を使用する前に計算した要素に遭遇した場合、再帰メソッド printSyra が値を早期に返すことができるようにするにはどうすればよいですか。

ドライバーコード:

public static void main(String[] args) {
    // TODO Auto-generated method stub
    Test t1 = new Test();
    System.out.println(t1.lengths(90090249));

    //System.out.println(t1.lengths(3));
}
4

1 に答える 1

0

再帰の代わりに反復法を使用する必要があります。その再帰的な方法は、スレッドのスタック トレースに圧力をかけます。

public static int printSyra(long num, int count) {
    if (num == 1) {
        return count;
    }

    while (true) {
            if (num == 1) break; else if (num%2 == 0) {num /= 2; count++;) else {num = (num*3) + 1; count++;} 
    }
    return count;
}
于 2012-10-07T18:16:47.950 に答える