Kurze Korrektur zu meiner Haskell-Funktion

Ugi25

Mitglied
Hi,

ich versuche gerade eine Aufgabe aus meinem Übungsblatt für Haskell zu lösen.

Hier die Aufgabe:

Die Zahl π kann mit der folgenden unendlichen Seriensumme berechnet werden:

Unbenannt.jpg

Definieren Sie eine Haskell Funktion roughlyPI, die bei Eingabe einer natürlichen Zahl k die Seriensumme von 0 bis zum k-Wert berechnet.

Mein Ansatz:

Code:
roughlyPI :: Double -> Double 
roughlyPI 0 = 2
roughlyPI n = e1/e2 + (roughlyPI (n-1))
                where
                    e1 = 2**(n+1)*(factorial n)**2
                    e2 = factorial (2*n+1)
                    factoial 0 = 1
                    factorial n = n*factoial (n-1)
main = do 
    putStrLn "Geben Sie bitte eine Zahl ein!"
    roughlyPI <- readLn :: IO Double
    print (roughlyPI)
--------------------------------------------------
Er macht aber das hier!
Ich will eigentlich nur, dass er die eingegebene Zahl berechnet

Geben Sie bitte eine Zahl ein!
155
155.0

Betätigen Sie eine beliebige Taste, um das Terminal zu schließen.


Irgendwas fehlt....
 
Zuletzt bearbeitet von einem Moderator:
Nur als Orientierung, in Java wäre es Dreizeiler:

Java:
    public static double factorial(int number) {
        double result = 1;

        for (int factor = 2; factor <= number; factor++) {
            result *= factor;
        }

        return result;
    }

    public static double roughlyPI(int k) {
        double sum = 0;
        for (int i = 0; i <= k; i++) {
            sum += Math.pow(2, i + 1) * Math.pow(factorial(i), 2) / factorial(2 * i + 1);
        }
        return sum;
    }

    public static void main(String[] args) {
        System.out.println(roughlyPI(-1));
        System.out.println(roughlyPI(0));
        System.out.println(roughlyPI(1));
        System.out.println(roughlyPI(2));
        System.out.println(roughlyPI(10));
        System.out.println(roughlyPI(20));
        System.out.println(Math.PI);
    }

Das muss doch auch in Haskell möglich sein denke ich...
 

tommysenf

Top Contributor
Code:
putStrLn "Geben Sie bitte eine Zahl ein!"
roughlyPI <- readLn :: IO Double
print (roughlyPI)

Du rufst deine Funktion ja auch gar nicht auf, sondern gibst nur den eigegeben Wert aus, dessen Variablennamen du unglücklicherweise genauso wie deine Funktion genannt hast...

Code:
putStrLn "Geben Sie bitte eine Zahl ein!"
input <- readLn :: IO Double
print (roughlyPI input)
 
Zuletzt bearbeitet von einem Moderator:
Wieso hat dein Dreizeiler eigentlich mehr Zeilen als die Haskell Version?
Ist das dein Ernst? Über schönheit lässt sich streiten. Hier wäre das Äquivalent als Zweizeiler:

Java:
    public static Function<Integer, Double> factorial = n -> IntStream.rangeClosed(2, n).mapToDouble(Double::valueOf).reduce(1.0, (s, a) -> s * a);

    public static Function<Integer, Double> roughlyPI = k -> IntStream.rangeClosed(0, k).mapToDouble(i -> Math.pow(2, i + 1) * Math.pow(factorial.apply(i), 2) / factorial.apply(2 * i + 1)).sum();

    public static void main(String[] args) {
        System.out.println(roughlyPI.apply(-2));
        System.out.println(roughlyPI.apply(-1));
        System.out.println(roughlyPI.apply(0));
        System.out.println(roughlyPI.apply(1));
        System.out.println(roughlyPI.apply(2));
        System.out.println(roughlyPI.apply(10));
        System.out.println(roughlyPI.apply(20));
        System.out.println(Math.PI);
    }
 

Neue Themen


Oben