2016-05-21 13 views
1

に実行してI以下の単純な再帰フィボナッチコードを持っている:私は最近の例外について学んだように、私はここに使用しようとしている私のスローされた例外はStackOverflowErrorが

public class FibPrac5202016 
{ 
public static void main(String [] args) { 
    Scanner input = new Scanner(System.in); 
    System.out.println("Enter index number: "); 
    int integer = input.nextInt(); 
    FibPrac5202016 object = new FibPrac5202016(); 

System.out.println(object.operation(integer)); 
} 

public static long operation(long n) { 
if(n==0) 
    return 0; 
if(n==1) 
    return 1; 
try { 
    if(n < 0) 
    throw new Exception("Positive Number Required"); 

} 
catch(Exception exc) 
{ 
    System.out.println("Error: " + exc.getMessage()); 

} 

return operation((n-1))+operation((n-2)); 
} 

} 

時にユーザが入力負integer.However、私のプログラムはStackOverflowErrorを実行します。

答えて

1

いいえ、の後にの後にあなたはExceptionをキャッチします。 catch-1を返すことで、簡単に修正できます。

catch(Exception exc) 
{ 
    System.out.println("Error: " + exc.getMessage()); 
    return -1; 
} 

または

public static long operation(long n) { 
    if (n < 0) { 
     return -1; 
    } else if (n == 0) { 
     return 0; 
    } else if (n == 1 || n == 2) { 
     return 1; 
    } 
    return operation((n-1))+operation((n-2)); 
} 

またはあなたがNegafibonaccisを実装できるように最初の場所でExceptionを投げません。そして、あなたはBigIntegerをサポートするためにそれを拡張することができ(とmemoizationと最適化)

private static Map<Long, BigInteger> memo = new HashMap<>(); 
static { 
    memo.put(0L, BigInteger.ZERO); 
    memo.put(1L, BigInteger.ONE); 
    memo.put(2L, BigInteger.ONE); 
} 

public static BigInteger operation(long n) { 
    if (memo.containsKey(n)) { 
     return memo.get(n); 
    } 
    final long m = Math.abs(n); 
    BigInteger ret = n < 0 // 
      ? BigInteger.valueOf(m % 2 == 0 ? -1 : 1).multiply(operation(m)) 
      : operation((n - 2)).add(operation((n - 1))); 
    memo.put(n, ret); 
    return ret; 
} 
+0

を以下のか、私も行うことができます0

としてよりも数が少ない見つけたときに解決策は、停止プログラムを作ることです 'でSystem.exit(0);'、右? –

0

のような問題は、これらがtryブロック内execcionを投げることであり、これは、内のコードをテストしているサイクルを作成して、いつものようになります0より小さい数は常に例外がスレッドで

例外を与えられ、無限まで、例外をスローしたことが「メイン」java.lang.StackOverflowErrorを

私は思いますあなたは

public class FibPrac5202016 { 
public static void main(String [] args) { 
    Scanner input = new Scanner(System.in); 
    System.out.println("Enter index number: "); 
    int integer = input.nextInt(); 
    FibPrac5202016 object = new FibPrac5202016(); 

     System.out.println(object.operation(integer)); 
} 

public static long operation(long n) { 
    if(n==0) 
    return 0; 
    if(n==1) 
    return 1; 
    try 
{ 
    if(n < 0)    
     throw new Exception("Positive Number Required"); 
} 
catch(Exception exc) 
{ 
    System.out.println("Error: " + exc.getMessage()); 
    //return -1; 
} 

return operation((n-1))+operation((n-2)); 
} 

} 
関連する問題