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

備忘としてのメモを記載

再帰の使い方まとめ

1,漸化式を表現する

 // f(n)をf(n-1)を使って表せたら再帰関数は作れる

 // a(0) = 3
 // a(n) = 2 * a(n-1) -1
let rec a = n =>
  switch (n) {
  | 0 => 3
  | _ => 2 * a(n - 1) - 1
  };

// 1からnまでの総和
// sum(0) = 0
// sum(n) = n + sum(n-1)

// 素数判定
// k=1 true
// k>1 「nが2..kで割り切れない」 =「nがkで割り切れない」&&「nが2..k-1で割り切れない」

2,要素を1つずつ取り出しチェックする

// lstの各要素を残りの要素に掛けたリストのリストを返す
let hdMultiplyRest = lst =>{
  let rm = (x, l1) => List.filter(el => el != x, l1);
  let sub = (x, l2) => List.map(el => el * x, l2);
  switch (lst) {
  | [] => []
  | _ =>
    lst |> List.fold_left((acc, cur) => 
            acc @ [sub(cur, rm(cur, lst))], [])
  };
}
hdMultiplyRest([2, 4, 10]);
- : list(list(int)) = [[8, 20], [8, 40], [20, 40]]

// filter : 条件を満たす要素だけ取り出す
// map : 関数を適用したlistを返す

3,count変数を保持する

// 先頭からn文字目まで取り出す
let rec take = (n, lst) =>
  switch (lst) {
  | [] => []
  | [h, ...t] => 
    n == 0 ? [] : [h, ...take(n - 1, t)]
  };