2017-09-22 3 views
1

私は整数の 与えられたリストの長さとの和を計算するための以下の機能を持っている:整数のリストの長さと合計を1回の計算でどのように計算するのですか?

fun 
length_and_sum 
(xs: list0(int)): $tup(int(*length*), int(*sum*)) = 
$tup(length(list0), list0_foldleft(xs, 0, lam(res, x) => res + x) 

この関数は二回与えられたリストを横断し、それがある(2回のパスが必要です。長さのために一回の合計のために一度)。これを1回のパスで行う方法はありますか?

答えて

2

タプルをアキュムレータとして使用します.1つの要素が合計を格納し、もう1つの要素が長さを格納します。

次に、折りたたみに渡す関数は、実質的には、引数(res,x)に対して(res + 1, res + x)を返します。

私はOCamlの観点からこの回答を書いています。実装は、あなたのケースのために少し異なる場合があります

次のようにそれを行うことができます
2

fun 
length_and_sum 
(
xs: list0(int) 
) : $tup(int(*length*), int(*sum*)) = 
list0_foldleft<$tup(int,int)><int> 
(
    xs, $tup(0, 0), lam(res, x) => $tup(res.0 + 1, res.1 + x) 
) 
関連する問題