【发布时间】:2021-02-15 21:05:49
【问题描述】:
我试图专门使用 recursion 解决硬币找零问题,结果遇到了以下代码。
问题:给定一些面额的无限硬币,计算数量。给定数量可以由它们形成的方式。
输入:
int[] coins = {1, 2};
int amount = 5;
int ways = change(amount, coins, coins.length - 1);
// expected ways = 3 --> 11111, 1112, 122
代码:
int change(int amount, int[] coins, int index) {
if (amount < 0) return 0;
if (amount == 0) return 1;
int ways = 0;
while (amount > 0 && index >= 0) {
ways += change(amount - coins[index], coins, index);
index = index - 1;
}
return ways;
}
我了解代码本身,也了解基本情况,但我无法了解它如何封装递归/解决方案。
例如。如果我正在解决factorial(n),我可以说factorial(n) = n * factorial(n-1),所以我可以清楚地“看到”递归。我无法在硬币变化示例中推断出类似的关系。谁能帮我解决这个问题?
【问题讨论】:
-
计算制造 50 个货币单位的方法数量的一部分是说“如果我使用 10 个单位的硬币,那么我就必须补足剩下的 40 个单位:有多少种方法是那?”。这就是递归关系。
-
这就是我想要达到的目标!你能详细说明一下吗?因此,如果我想从
{2, 1}获取5,我需要在从{2, 1}获取3的解决方案中添加什么?基本上在阶乘递归中,我必须将 n 乘以先前的解决方案。这里对应的概念是什么? -
从2和1做成5,可以从2开始,那么剩下的3有很多方法;或者你可以从 1 开始,那么剩下的 4 有很多种方法。这两个选项结合起来给出了 5 的方法数。
-
谢谢!仍然不是 100% 清楚,但我会花一些时间在上面。
标签: java recursion coin-change