函数式编程思想
2018-07-02 本文已影响0人
喂喂喂章鱼
换硬币问题
问题就是动态规划里面的换硬币问题。所以函数式编程的关键和动态规划问题一样:递归关系式。换硬币问题发现他的递归关系并不难。
假定可用的硬币已经排了某种顺序(从大到小),于是就有以下关系:
将总数为a现金换成n种硬币的不同方式的数目等于:
1.将现金数a换成除第一种硬币之外的所有其他硬币的不同方式数目,加上
2.将现金数a-d换成所有种类的硬币的不同方式数目,其中的d是第一种硬币的币值
这种方法的正确性:1和2可以看成两种分类,1里都没有使用第一种硬币,2里都使用了第一种硬币(至少使用了一个第一种的),1并2为全集,所有的情况都考虑了进来。
如此这般问题递归地归约为对更少现金数或者更少种类硬币的同一个问题。
而特殊情况如下:
1.如果a就是0,应该算作是有一种换零钱的方式
2.如果a小于0,应该算作是有0种换零钱的方式
3.如果n是0,应该算作是有0种换零钱的方式
function count_change(amount,n){
var m = n||5;
if(amount ===0) return 1;
if(amount<0 || n===0) return 0;
return count_change(amount,m-1)+count_change(amount-value_of_currency(m),m);
}
function value_of_currency(n){
if(n===1) return 1;
if(n===2) return 5;
if(n===3) return 10;
if(n===4) return 25;
if(n===5) return 50;
}