challenge 急勾配の判定

有限の長さの数列で,各要素の値が,その要素の後ろにある残りの列に含まれるすべての要素の和よりも大きい列を「急勾配の列」ということにします(空列の和は0とします).

任意の長さ(ただし有限の長さの)数列を与えられたとき,それが「急勾配の列」であるかどうかを判定する述語関数を定義してください.

必須ではありませんが,効率についてコメントがあれば面白いかもしれませんね.

Posted feedbacks - OCaml

OCaml学習中。

1
2
3
4
5
let rec super_inc n lst = match lst with
    []     -> true
  | a::rst -> if n < a then (super_inc (n+a) rst) else false

let super_dec lst = f 0 (List.rev lst)

訂正。super_dec関数内で呼び出す関数名が間違ってました。 あと、計算量は O(n)です。

1
2
3
4
5
let rec super_inc n lst = match lst with
    []     -> true
  | a::rst -> if n < a then (super_inc (n+a) rst) else false;;

let super_dec lst = super_inc 0 (List.rev lst);;

ほとんどOCaml互換。計算量はO(n)です。
1
2
3
4
let isSteep ls =
    List.fold_right (fun x (result, sum) ->
        if result && x > sum then (true, sum + x) else (false, sum)
    ) ls (true, 0) |> fst

Index

Feed

Other

Link

Pathtraq

loading...