再帰の使い方まとめ
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)] };