スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

F#雑記 ある要素がn個以上の条件を満たすか

みずぴーさんの次の記事にインスパイアされて次のような問題を考えてみました。(みずぴーさんのと問題は異なります。) 
 
「いくつかの条件と一つの要素が与えられたとき、その要素がそれらの条件のうち少なくともm個を満たしたらtrue、そうでないときはfalseを返す関数をかけ」
 
条件群は'a -> false型の関数のリストで与えられるものとして、条件の適用をなるだけ少なくする方針で書いたコードが次です。
 
> let moreThanNmeetCondition (preds : list<'a -> bool>) (n:int) (ele:'a) =
    let allCondNum = List.length preds
    //countは条件も満たしたものの個数
    //tryNumは条件を試した回数
    let rec submtnc lst count tryNum=
        if allCondNum - tryNum < n - count then
            false
        elif count = n then
            true
        else
            match lst with
            | []       -> false
            | hd :: tl -> let newCount = 
                              if hd ele = true then (count + 1)
                              else count
                          submtnc tl newCount (tryNum + 1)
    submtnc preds 0 0;;
 
val moreThanNmeetCondition : ('a -> bool) list -> int -> 'a -> bool
 
使用例
 
> let conds = [(fun x -> x % 2 = 0);(fun x -> x % 3 = 0);(fun x -> x % 4 = 0);(fun x -> x % 5 = 0);
                (fun x -> x >= 2);(fun x -> x >= 1);(fun x -> x <= 10);(fun x -> x <= 3)]   ;;
 
val conds : (int -> bool) list =
  [<fun:conds@48-8>; <fun:conds@48-9>; <fun:conds@48-10>; <fun:conds@48-11>;
   <fun:conds@49-12>; <fun:conds@49-13>; <fun:conds@49-14>; <fun:conds@49-15>]
 
> moreThanNmeetCondition conds 3 100;;
val it : bool = true
 
> moreThanNmeetCondition conds 5 100;;
val it : bool = true
 
> moreThanNmeetCondition conds 6 100;;
val it : bool = false
スポンサーサイト

テーマ : プログラミング
ジャンル : コンピュータ

trackback


この記事にトラックバックする(FC2ブログユーザー)

ある要素がn個以上の条件を満たすか

【F#】ある要素がn個以上の条件を満たすか

コメントの投稿

非公開コメント

プロフィール

T GYOUTEN

Author:T GYOUTEN
F#と英単語とフリーソフトと読書に興味があります。
ホームページでフリーソフトも公開しています。どぞ御贔屓に。

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
フリーエリア
フリーエリア
blogram投票ボタン
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。