递归法取硬币java_硬币改变递归方法

已经发布了这个问题的解决方案,所以我假设你问的是如何思考它,而不是答案本身 .

试试这个:

设V为目标值 .

设C [i]为第i个硬币值 .

递归解决方案是关于做出减少问题大小的选择,然后在较小的问题上递归使用相同的解决方案 .

当问题小到足以轻易解决而不再发生时,我们只返回该解决方案 . 这是“基本情况” .

这里的选择是使用具有值C [i]的特定数量N [i]的硬币 .

我们需要对所有可能的N [i]值,即N [i] = 0,1,2,... floor(V / C [i]) . 整数层(V / C [i])只是可能产生正确变化的第i个硬币的最大数量 .

一旦我们选择了多少枚硬币,我们就不应该改变这个决定 . (这是你的解决方案出错的地方 . )最简单的方法是利用硬币的隐式顺序,因为它们的数组索引 . 我们递归地找到使用i 1和更大的硬币进行更改的方法的数量,用于目标值的剩余部分:V - N [i] * coins [i] .

(另一种设计是将硬币保留在一组中,并通过在重复之前从集合中移除硬币[i]来做出选择 . 但是让我们继续使用索引,因为生成的代码更简单 . )

为了产生结果,我们只需将所有递归确定的计数相加 .

通过这种思考,我们可以为递归方法选择一个签名:

/**

* Return the number of ways to make change for the given value

* using coins i >= iMin.

*/

int count(int value, int iMin);

是时候考虑基础案例了 . "Success"是 value 恰好为零时:我们可以通过什么都不做来完全改变!当 value isn 't zero, and we'超出硬币值时,会发生"Failure" . 这恰好是 iMin 已达到 coins 数组的长度 .

让我们把这个想法放到代码中:

int count(int value, int iMin) {

if (value == 0) return 1; // Success base case.

if (iMin >= coins.length) return 0; // Failure base case.

result = 0;

for (int ni = 0; ni <= value / coins[iMin]; ++ni)

result += count(value - ni * coins[iMin], iMin + 1);

return result;

}

要开始递归,只需使用目标值和 iMin 为零:

int result = count(target, 0);

请注意,尽管此解决方案是正确的,但效率并不高 . 让我们再讨论这一天 .

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值