スポンサーサイト

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

どう書く?org F#  全ての組み合わせ

 
「どう書く?org」http://ja.doukaku.org/に挑戦4問目です。 
さて今回の問題は次のような内容。 
 
(問題) 
全ての組み合わせhttp://ja.doukaku.org/44/
 
2個以上のリストlist1, list2, list3...が与えられたときに、その複数個のリストの中の要素を一つずつとりだして組にする方法の全通りのリストを返すコードを書いてください。 
 
 CrossProduct [[1,2,3,4], [10;20]]

 [[1; 10]; [2; 10]; [3; 10]; [4; 10]; [1; 20]; [2; 20]; [3; 20]; [4; 20]]
 
 CrossProduct [['a';'b';'c']; ['x';'y'];['K';'L';'M']];;

  [['a'; 'x'; 'K']; ['b'; 'x'; 'K']; ['c'; 'x'; 'K']; ['a'; 'y'; 'K'];
   ['b'; 'y'; 'K']; ['c'; 'y'; 'K']; ['a'; 'x'; 'L']; ['b'; 'x'; 'L'];
   ['c'; 'x'; 'L']; ['a'; 'y'; 'L']; ['b'; 'y'; 'L']; ['c'; 'y'; 'L'];
   ['a'; 'x'; 'M']; ['b'; 'x'; 'M']; ['c'; 'x'; 'M']; ['a'; 'y'; 'M'];
   ['b'; 'y'; 'M']; ['c'; 'y'; 'M']]
 
が返って来るようなものを書いてみました。
 
コードは次の通りです。
 
let CrossProduct (ingred : 'a list list) =
    let rec product rem res =
        match rem with
        | [] -> res
        | h ::tl -> product tl [for i in h do for j in res do yield (i :: j) ] 
 
    product (ingred.Tail) (List.map (fun x -> [x]) ingred.Head)
    |> List.map (fun lst -> List.rev lst) 
 
これは、答えの種を準備しておいて、再帰関数でそれを育てあげていく方法で解いていますが、
iwkさんによる再帰関数の別の例もhttp://ja.doukaku.org/44/lang/ocaml/に載ってます。
(なんと3行です。)
 
おしまい。
スポンサーサイト

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

コメントの投稿

非公開コメント

プロフィール

T GYOUTEN

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

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

この人とブロともになる

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