2017-02-10 4 views
2

다음 방정식이 ai이라고 가정 해 봅시다. 내 목표는이 다음 요소를 반환하는 시퀀스를 만드는 것입니다. 여기 내 솔루션 그리고 그것은 작동합니다수학 순서 추가 요소

이제
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))) 

, 유비, 나는 식에 따라 요소를 반환 시퀀스를 생성하고 싶습니다 : 나는 몇 가지 코드를 가지고 e do x

을하지만, 그렇게하는 방법을 잘못 작동하게 만들다?

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

답변

3

방정식의 (1.0/계승 (0.0)) 부분을 건너 뛸 수 없습니까? 아니면 질문에 오해 한 것일 수 있습니다.

편집 : 즉

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

편집 : 당신이 사용하는 '소요'및 '합'을 사용할 수 있습니다 요약 할 수있는 서열을 절단합니다. 다음은 동일한 seq2sum 12 3.0을 얻을

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

에로 약 20 함수형 언어에 대한

+0

Lol, 나는'(x^0)/0! = 1/0! '보다 빠릅니다. 이제 작동합니다. – matoex

+0

그건 그렇고, 시퀀스의'x' 요소의 합을 얻는 방법은? – matoex

+0

좋습니다, 작동합니다. – matoex

3

의 좋은 점은 당신이 당신의 솔루션을 가능한 한 원래의 정의에 가깝게 표현 될 수 있다는 것입니다 :-). 당신은 대부분의 기능에 대한 명시 적 유형 선언을 피할 수

: 무한 시리즈

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 

, 당신은 무한 시리즈는 평가를 완료하지 않습니다, 당신 합 전에 처음 n 개의 항목을 차지해야합니다 :

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

고마워, 그게 나를 위해 작동합니다. – matoex