2016-10-01 8 views
0

Ich schrieb Code, um eine Anzahl von Quadratwurzel mit in Babylonian-Methode zu erhalten.Babylonian Methode Rekursion Ausnahme: StackOverFlow

Ich frage Eingabe-Nummer des Benutzers, dann fragen Benutzer raten.

public class JanghyupLee_H02 { 

private double number; 
private double guess; 

public static void main(String[] args) { 
    // TODO Auto-generated method stub 

    String input; 
    Scanner userInput = new Scanner(System.in); 

    JanghyupLee_H02 AR = new JanghyupLee_H02(); 

    System.out.println("Type a number : "); 
    input = userInput.next(); 

    if (input.equals("0") || input.equalsIgnoreCase("exit") || input.equalsIgnoreCase("no")) { 
     System.exit(0); 

    } else { 

     AR.setNumber(Integer.parseInt(input)); 

    } 

    System.out.println("Type your guess : "); 
    input = userInput.next(); 

    if (input.equals("0") || input.equalsIgnoreCase("exit") || input.equalsIgnoreCase("no")) { 
     System.exit(0); 
    } else { 

     AR.setGuess(Double.parseDouble(input)); 

     double newGuess = AR.getGuess(); 

     AR.testGuess(newGuess); 

    } 

} 

public double getNumber() { 
    return number; 
} 

public void setNumber(double inputNumber) { 
    this.number = inputNumber; 
} 

public double getGuess() { 
    return guess; 
} 

public void setGuess(double guessNumber) { 
    this.guess = guessNumber; 
} 

public double testGuess(double guess) { 
    double guessAcurracy = (getNumber() - (getGuess() * getGuess())); 

    //exeption error here 
    if ((guessAcurracy == 0) && (guessAcurracy <= 0.000005)) { 
     System.out.println(guess); 

     return guess; 
    } else { 

     setGuess((((0.5) * (getGuess() + getNumber()/getGuess())))); 
     System.out.println(guess); 
     System.out.println("---------------------"); 
     return testGuess(getGuess()); 
    } 

} 

}

Grundsätzlich ist guessAcuraccy Subtraktion des ersten Eingang und zwei an den

berechnet ausgegeben. (So, dass die Antwort auf die Eingangsnummer immer näher)

Ich habe ein Ausnahmefehler bei dort,

auch wenn ich schrieb || statt & &. (eigentlich || dies nicht rekursiv geht)

Exception in thread "main" java.lang.StackOverflowError bei sun.misc.FloatingDecimal $ BinaryToASCIIBuffer.dtoa (FloatingDecimal. java: 431) bei sun.misc.FloatingDecimal $ BinaryToASCIIBuffer.access 100 $ (FloatingDecimal.java:259)

ich diese Ausnahmefehler erhalten,

Bitte lassen Sie mich wissen, was hier falsch ist.

+0

Haben Sie versucht, dies mit einem Debugger zu durchlaufen? Es ist erstaunlich, was du damit lernen kannst. – pjs

Antwort

1

Das sieht verdächtig:

double guessAcurracy = (getNumber() - (getGuess() * getGuess())); 

Quadrate zu vergleichen, sollte es sein:

double guessAcurracy = (getNumber() * getNumber() - (getGuess() * getGuess())); 

Oder einfacher/gewöhnlich/effizient:

double guessAcurracy = Math.abs(getNumber() - getGuess()); 

Auch dies verdächtig aussieht:

if ((guessAcurracy == 0) && (guessAcurracy <= 0.000005)) { 
    // stop recursion 

Rekursion stoppt nur, wenn guessAcurracy genau Null ist, was für das Ergebnis einer Gleitkommaberechnung sehr unwahrscheinlich ist.

Entfernen Sie insgesamt den Test für die Gleichheit mit Null.

+0

Wie ich oben erwähnt habe, habe ich versucht, es zu ändern, aber es hat nicht funktioniert –

+0

@jan Update für Ihren Fehler sehen – Bohemian

+0

Wie Bohemian schon gesagt: das kann nicht funktionieren. (guateAcorracy == 0) && (guessAcuracy <= 0.000005) ist gleich (guessAcurracy == 0). Was Sie tun möchten, ist zu verwenden (rateAcuracy <= 0.000005). –

Verwandte Themen