Java :: Aufgabe #206
2 Lösungen
Rekursieve Fakultät von n
Fortgeschrittener - Java
von FHEM
- 22.07.2018 um 19:09 Uhr
Erstelle ein programm das n! = 120 zum beispiel nach n auflöst.
Ansatz: 5! =5*4*3*2*1 also müsste n=120/5/4/3/2/1
Ansatz: 5! =5*4*3*2*1 also müsste n=120/5/4/3/2/1
Lösungen:
Anmerkung: Wenn Zahlen wie 121 eingegeben werden kommt als Ergebnis trotzdem raus, dass die Fakultät von 121 5! ist. Ich wusste aber nicht wie ich dieses Problem lösen soll
Main-Klasse:
Methoden die ich aus meinem eigenem Methodensammlung package benutzt habe:
Main-Klasse:
Java-Code
import Methodensammlung.Methoden; /** * Für eine Zahl wird die zugehörige Fakultät berechnet * * @author (nOrdan) * @version (09.06.2019) */ public class Fakultät { Methoden m = new Methoden(); public static void main(String [] args) { Fakultät f = new Fakultät(); f.inputs(); } private void inputs() { boolean valid1 = false; int n = 0; while (valid1 == false) { String input1 = m.userInput("Geben sie ihre Zahl ein für welche die rekursive Fakultät berechnet werden soll"); m.errorIntInput(input1); try { n = m.parseInt(input1); valid1 = true; } catch(Exception e) { m.errorMessage("Invalid user input","Invalid input"); } m.informationMessage("Die rekursive Fakultät für " + n + " ist " + berechnung(n),"Ergebnis"); } } private int berechnung(int n) { for (int i = 1; i != n; i++) { n /= i; } return n; } }
Methoden die ich aus meinem eigenem Methodensammlung package benutzt habe:
Java-Code
public String userInput(String message) { return JOptionPane.showInputDialog(message); } public int parseInt(String input) { return Integer.parseInt(input); } public void errorIntInput(String input) { if (input == null) { System.exit(0); //Drückt der User auf abbrechen wird null zurück gegeben und das Programm wird beendet } else if (input.isEmpty() == true) { } } public void errorMessage(String message,String errorName) { JOptionPane.showMessageDialog(null,message,errorName,JOptionPane.ERROR_MESSAGE); } public void informationMessage(String message,String informationName) { JOptionPane.showMessageDialog(null,message,informationName,JOptionPane.INFORMATION_MESSAGE); }
Java-Code
/** * Berechnung des Faktors zur Fakultät von n! = 120 * Ermittelt wird der Wert n. * * Hinweis: * Für n! = 33 wird bsp. keine Lösung gefunden, da nur ganzzahlige n geprüft werden, daher * wurde das Programm um eine numerische Berechnung (Stirlingformel) erweitert! * * Mit der Schrittweite kann die Genauigkeit verbessert werden! * * @author HR_SS * */ public class RekursivFakultaet { public static void main(String[] args) { double n = 120; for(int i = 0; i <= n; i++) { int x = rekursivFakultaet(i); if(x == n) { System.out.println("Faktor zur Fakultät n! = " + n + " ist: " + i); System.out.println("--------------------"); return; } } System.out.println("Es wurde kein ganzzahliger Faktor gefunden..."); System.out.println("Starte numerische Berechnung..."); double schrittweite = 0.001; double start = 0; while(true) { double naeherung = Math.sqrt(2*start*Math.PI)*Math.pow((start/Math.E), start); if(naeherung >= n) { System.out.println("Faktor zur Fakultät n! = " + n + " ist: " + start); System.out.println("--------------------"); return; } //System.out.println(start); start = start + schrittweite; } } private static int rekursivFakultaet(int n) { if(n > 1) { return n * rekursivFakultaet(n-1); }else { return 1; } } } /* Bei Eingabe n = 120 Ausgabe: Faktor zur Fakultät n! = 120.0 ist: 5 -------------------- Bei Eingabe n = 33 Ausgabe: Es wurde kein ganzzahliger Faktor gefunden... Starte numerische Berechnung mit Schrittweite: 0.001 Faktor zur Fakultät n! = 33.0 ist: 4.220999999999744 -------------------- */