2016-04-04 32 views
0
import java.util.*; 

public class NRootx { 

    public static Double NRmethod (Double num, int root, Double guess){ 
     guess= num/(root+1); //first guess 

     Double guess_output=1.0; 

     for (int i=1;i<=root; i++) 
     { 
      guess_output *= guess; 
     } 

     Double error= guess_output-num; 
     error = error * 0.001; 
     guess = guess - error; 

     if (Math.abs(error)>=0.000001) 
      return NRmethod(num, root, guess); //Recursion 
     else 
      return guess; 

      //I can't find out the problem now. Java.lang.StackOverFlow error is showing. 

     } 
    } 
} 

// Main function 
public static void main(String[] args) { 

    Double x; 
    int n; 
    Scanner sc= new Scanner (System.in); 
    System.out.println("Enter the value of x: "); 
    x=sc.nextDouble(); 
    System.out.println("Enter the value of n: "); 
    n=sc.nextInt(); 
    Double guess=x/(n+1); 
    Double ans= NRmethod(x,n,guess); 
    System.out.println("The value of y is ="+ans); 
} 

私はこれを解決するのを手伝ってください。私はこれを何度もやっていることに疲れている。エラーはありません! java.lang.StackOverflowErrorで解決策を見つけることができません

+1

'StackOverflowError'とは関係がありませんが、' Double'の代わりに 'double'を使うので、不要な' Double'オブジェクトを作る必要はありません。 –

+1

また、 'guess_output = Math.pow(推測、ルート);'、forループの必要はありません。 –

答えて

3

あなたはrootnumを変更することはありません、あなたはguess= num/(root+1);に各呼び出しでguessをリセットするので、あなたはStackOverflowErrorにつながる、無限再帰を取得します。

私は正しいロジックがどうあるべきかわからないんだけど、あなたはそれぞれの再帰呼び出しにrootまたはnumの異なる値を渡す必要がありますのいずれか、またはメソッドの開始時にguessをリセットしない無限再帰を防ぐために。

+0

ありがとうございます。だから私は推測の価値を与えるためにユーザーを促進する。 –

0

私は自分自身で答えを得ました。推測を求めて問題を解決します。私が与えたコードのような推測を設定する必要はありません。しかし、理由はわかりませんが、問題を解決しました。ありがとうございました。

関連する問題