競技プログラミングのためのF#入門
1 2 |
|
正のn
に対するn
進展開とn
進展開を十進展開に直す関数をライブラリに記録しています. 具体的にはArithmetics.fsxのdecimalToNary
とnaryToDecimal
関数です. 必要に応じて参照してください.
うまく実装すれば処理できると思いますが, ここでは単純にN=0
かどうかで場合わけします. 本体の処理は再帰関数で対応するため, 大枠は次のように実装します.
1 2 3 |
|
再帰関数は数値のリストを作って, 最後にString.concat
で連結します.
まず引数にわたってくるn
を2
で割ってどんどん小さくします. n=0
になったら積んできたリストを返せばよいため, if n=0 then acc
は規定路線です. あとは本体の再帰プロセスを考えます.
-2
進の部分で少し工夫が必要です. 結論から書くと次のように書けます.
1 2 3 |
|
F#の%
は負の数に対して負の値を返すため, abs
をかませて正の値にした上でacc
に積みます. 次にfrec
に食わせる値は(k-n)/2
にしています. もちろんここは(n-k)/(-2)
でいいのですが, 符号分を手計算で処理しています.
unfold
による処理¶同じ処理をunfold
で書きます. こちらは結論だけにします.
1 2 3 4 5 6 7 |
|
unfold
は公式リファレンスまたはReference.fsxを参照してください.