スポンサーサイト

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

F# 雑記 循環小数

 BLUEPIXYさんのブログ(循環小数)がおもしろそうだったので、自分でもやってみました。 
(5か月ぐらいコードを書いていないのでリハビリです。) 
問題は分数を循環小数表示するというもので、次のような結果になります。 
 
> rdToString 1 7;; 
val it : string = "0.{142857}" 
> rdToString 1234 555;; 
val it : string = "2.2{234}" 
> rdToString 1 3;; 
val it : string = "0.{3}" 
> rdToString 1 8;; 
val it : string = "0.125" 
> rdToString 12 8;; 
val it : string = "1.5" 
> rdToString -1 7;; 
val it : string = "-0.{142857}" 
 
コードは以下の通り 
 
//実行例//// examineDiv 1234 555 0 1 [] Map.empty;; 
//////////// val it : string list * int option = (["4"; "3"; "2"; "2"; "2"], Some(2)) 
let rec examineDiv n d rem recurPos qStrLst remMap = 
    let q =   n / d 
    let rem = n % d 
    let qStr =  q.ToString() 
    if   rem = 0 then //割り切れる 
        ((qStr::qStrLst),None) 
    elif  Map.containsKey rem remMap then //循環ポイントが見つかる  
        (qStr::qStrLst,Some(remMap.[rem])) 
    else 
        examineDiv (10*rem) d rem (recurPos+1) (qStr::qStrLst) (Map.add rem recurPos remMap )         
 
//実行例/// revAndPlusBrackets 2 ["4"; "3"; "2"; "2"; "2"] [];; 
/////////// val it : string list = ["2"; "2"; "{"; "2"; "3"; "4"; "}"] 
let rec revAndPlusBrackets (pos:int) (iLst:list<string>)  (res:list<string>)  = 
    let niLst = List.length iLst 
    if niLst = pos then 
         (List.rev iLst) @  ["{"] @ res @ ["}"] 
    else 
        revAndPlusBrackets pos (List.tail iLst) ((List.head iLst) :: res)  
 
 
let rdToString n d = 
    let signStr = if n*d < 0 then "-" else "" 
    let (qStrLst,recurPos) = examineDiv (abs n) (abs d) 0 1 [] Map.empty  
    let tempStrLst = //["2"; "2"; "{"; "2"; "3"; "4"; "}"]など 
        if recurPos = None then 
            List.rev qStrLst          
        else 
           revAndPlusBrackets recurPos.Value qStrLst []  
    signStr + (List.head tempStrLst) + "." + (List.fold (+) "" (List.tail tempStrLst)) 
スポンサーサイト

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

trackback


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

【F#】循環小数

【F#】循環小数

コメントの投稿

非公開コメント

やっぱ再帰かなぁ

こんにちは、しょうもない記事におつきあい頂き恐縮です。

再帰を使った方が、若干スマートですかねぇ。
パラメータがちょっとわかりにくいような気もしますが。
>val it : string list * int * bool
は、
string list * int option
の間違いですね。(仕様変更?)
あと、ウチの動作と少し違う所を発見しました。
(3,3) => "1.0"
3 3 => "1."

No title

どもです。訂正しました。
テストしやすいようにトップレベルに関数を並べ独立性を高めると、パラメーターが多くなってしまいます。変化するものと、変化しないものが両方とも同等扱いのパラメーターになってしまうのも悩みの種です。(命名を考えるべき?)
プロフィール

T GYOUTEN

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

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

この人とブロともになる

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