2017-02-10 2 views
2

Nehmen wir an, ich habe folgende Gleichung ai. Mein Ziel ist es, eine Sequenz zu erstellen, die die nächsten Elemente zurückgibt. Hier ist meine Lösung und es funktioniert:Mathematische Reihenfolge weitere Elemente

let rec factorial(n:float) = 
    match n with 
    |0.0 -> 1.0 
    |n -> n * factorial(n-1.0) 

let seq1 = Seq.initInfinite(fun i -> factorial(float(i))/sqrt(float(i)+1.0))) 

nun analog, würde Ich mag Sequenz zu erzeugen, die Elemente Rückkehr nach Gleichung: e do x

ich einen Code haben, aber es ist falsch, so wie man Bring es zum Laufen?

let seq2(x:float) = Seq.initInfinite(fun a -> let i = float(a)          
               (1.0/factorial(0.0)) + System.Math.Pow(x,i)/factorial(i)) 

Antwort

3

Können Sie die (1.0/Fakultäts (0.0)) ein Teil der Gleichung nicht überspringen (oder vielleicht falsch verstanden habe ich die Frage).

edit: das heißt

let seq2(x:float) = 
    Seq.initInfinite(fun a -> 
    let i = float(a) in 
     System.Math.Pow(x,i)/factorial(i)) 

edit: eine seq abschneiden können Sie 'nehmen' und Sie können summieren verwenden 'Summe'. Wie in

let seq2sum nbelems = 
    seq2 >> Seq.take nbelems >> Seq.sum 

dann erhalten Sie seq2sum 12 3.0 gleich ca. 20 :-)

+0

Lol, das habe ich nicht überprüft '(x^0)/0! = 1/0! 'Früher. Es funktioniert jetzt. – matoex

+0

Übrigens, wie erhält man die Summe von 'x' Elementen der Sequenz? – matoex

+0

Das ist gut, funktioniert. – matoex

3

Das Tolle an funktionalen Sprachen ist, dass Sie Ihre Lösung so nah Ausdruck der ursprünglichen Definition wie möglich sein können.

Sie explizite Typdeklarationen für die meisten Funktionen vermeiden:

let rec factorial = function 
| 0 -> 1 
| n -> n * (factorial (n-1)) 


let e x n = 
    seq { 0 .. n } 
    |> Seq.map(fun i -> x ** (float i)/float (factorial i)) 
    |> Seq.sum 

In der unendlichen Reihe, werden Sie die ersten n Einträge, bevor Sie Summe nehmen, als eine unendliche Reihe wird die Bewertung nie fertig:

let e' x n = 
    Seq.initInfinite(fun i -> x ** (float i)/float (factorial i)) 
    |> Seq.take n 
    |> Seq.sum 

e 1.0 10 //2.718281801 
e' 1.0 10 //2.718281801 
+0

Danke, das funktioniert auch für mich. – matoex

Verwandte Themen