両替

id:smeghead:20070713:coin の続き

気力の持つ間はたらたら進めます。

両替の関数を作ろうとしていますが、結構面倒でした。

両替の元の硬貨と財布を引数として受けとり、両替した硬貨と両替後の財布を返す関数にしました。

(exchange 100 '((10 . 14) (1 . 16)))
=> (10 . 10), ((10 . 4) (1 .16))

未完成版です

(defun exchange (coin wallet)
(if (eql coin 1) (values nil wallet)
(progn
(loop for unit in (reverse *coins*)
do (if (<= coin (* (count-coins unit wallet) unit))
(return
(values (cons unit (/ coin unit))
(pickup-coins unit (/ coin unit) wallet))))))))

10円玉を、5円玉1枚と1円玉5枚というような両替を考えないと簡単なんですが。。

100円玉を、50円玉1枚と10円玉4枚と5円玉1枚と1円玉5枚と両替というのもありえるし。

たくさん場合分けすれば書けるけど、変にこだわってしまう。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です


reCaptcha の認証期間が終了しました。ページを再読み込みしてください。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください