両替の計算その2:問題2.19
まるで魔法のようにうまくいっちゃんだなあ・・・。
勉強になる。
----
typedef
List CoinList;
const
CoinList exceptFirstDenomination
(const
CoinList& coinValues)
{
return(cdr(coinValues));
}
const
double firstDenomination(const CoinList& coinValues)
{
return(value<double>(car(coinValues)));
}
const
bool isNoMore(const CoinList& coinValues)
{
return(isNull(coinValues));
}
const
int cc(const double amount, const CoinList& coinValues)
{
if(0==amount){return(1);}
else if(0>amount ||
isNoMore(coinValues)){return(0);}
else{
return(cc(amount,exceptFirstDenomination(coinValues))
+cc(amount-firstDenomination(coinValues),coinValues));
}
}
const
int countChange(const double amount,const CoinList& coinValues)
{
return(cc(amount,coinValues));
}
int
main(int argc, char** argv)
{
const auto
usCoins(makeList(50.0,25.0,10.0,5.0,1.0));
const auto
ukCoins(makeList(100.0,50.0,20.0,10.0,5.0,2.0,1.0,0.5));
cout<<"# of exchanges for
1$="<<countChange(100.0,usCoins)<<endl;
cout<<"# of exchanges for
1pound="<<countChange(100.0,ukCoins)<<endl;
return(0);
}
----
出力
----
#
of exchanges for 1$=292
#
of exchanges for 1pound=104561
0 件のコメント :
コメントを投稿