院卒新人サラリーマンのメモ代わり

備忘としてのメモを記載

aux関数 少しまとめ

前からの結果が必要(回数を数えるcount, 経路を覚えとくpathList)
ー> 補助関数を使う
ー> countなどを引数として渡す(引数の意味はコメントに書いておくこと)

結果が複数あるもの
ー> 結果が出たらaccに詰めて、引数として渡す
ー> 最後にaccを返せば出来上がり(accも結果が入って最終的に返すものってコメントが有ると良い)
fold_leftは引数として渡さなくてもaccを含んでる

let encode = list => {
  let rec aux = (count, acc, list) =>
    switch (list) {
    | [] => [] /* Can only be reached if original list is empty */
    | [x] => [(count + 1, x), ...acc] /* 最終的にはaccを返す */
    | [a, ...[b, ..._] as rest] =>
      if (a == b) {
        /* countは引数として渡す */
        aux(count + 1, acc, rest);
      } else {
        /* 結果はaccに詰めていく */
        aux(0, [(count + 1, a), ...acc], rest);
      }
    };
  List.rev(aux(0, [], list));
};