2014-07-11 1 views
0

C# 배경에오고 F #을 배우려고합니다.
나는 크기 256의 배열을 반복하기 위해 노력하고있어, 그래서 그것의 총합이 같은 요소의 위치와 요소의 제품 수 :F # 요소 위치가있는 배열의 곱의 합

float sum = 0.0; 
for (int i = 0; i < 256; i++) { 
    sum += i * arr[i]; 
} 

내가 이것을했지만 난 몰라 이것이 F #에서 할 수있는 최선의 방법인지 아닌지 아십시오.

let mutable sum = 0 
for i in 0 .. 255 do 
    sum <- sum + i * arr.[i] 
done 

이 더 나은 방법으로이 문제를 해결하기 위해 Array.fold 또는 Array.iteri을 사용할 수 있는지 모르겠어요.

답변

4

당신은 mapisum을 사용할 수 있습니다 : 배열을 하나의 반복으로이 일을

let f s = s |> Seq.mapi (fun i j -> i * j) |> Seq.sum 
+0

감사합니다. 지금 바로 순서를 배우십시오. – EinsL

+0

@LDcr'Array' 모듈은'sum'뿐만 아니라'mapi' 함수도 가지고 있습니다. 그냥 참고하시기 바랍니다 :) –

+0

고마워요, 내가 몇 가지 테스트를했는데 코드에서 성능이 향상되었습니다. 그리고 1로 배열을 만들면 F # 방식으로 숫자 오버플로가 생깁니다. 1900 요소입니다. 내가 게시 한 평가 코드에 일부 오류가있을 수 있습니다. 가능한 경우 누군가 제발 확인하십시오. – EinsL

0

한 가지 방법 :

내가 따라 훨씬 쉽게 것으로 대통령의 솔루션을 선호하지만
let f s = snd (Array.fold (fun (i, sum) x -> (i + 1, sum + x * float i)) (0, 0.0) s) 

.

다른 대안은 사용자 고유의 Array.foldi 함수를 작성하여 사용하는 것입니다.