在硬币兑换类型的问题中,我们通常需要计算用最少数量的硬币来兑换特定金额。递归方法是一种直观的解决方案,但可能会导致性能问题,特别是当金额较大时。迭代方法可以提供更好的性能。下面是将递归函数重构为迭代函数的详细解释和示例代码。
假设我们有面值为 [1, 2, 5]
的硬币,目标是兑换金额为 11
的最少硬币数量。
def coin_change_recursive(coins, amount):
if amount == 0:
return 0
if amount < 0:
return float('inf')
min_coins = float('inf')
for coin in coins:
result = coin_change_recursive(coins, amount - coin)
if result != float('inf'):
min_coins = min(min_coins, 1 + result)
return min_coins
def coin_change_iterative(coins, amount):
# 初始化一个数组,dp[i] 表示兑换金额 i 所需的最少硬币数量
dp = [float('inf')] * (amount + 1)
dp[0] = 0 # 兑换金额 0 所需的硬币数量为 0
for i in range(1, amount + 1):
for coin in coins:
if i - coin >= 0:
dp[i] = min(dp[i], dp[i - coin] + 1)
return dp[amount] if dp[amount] != float('inf') else -1
amount + 1
的数组 dp
,其中 dp[i]
表示兑换金额 i
所需的最少硬币数量。初始值设为 float('inf')
,表示无法兑换。dp[0] = 0
,因为兑换金额 0 不需要任何硬币。i
,遍历所有硬币面值,如果 i - coin >= 0
,则更新 dp[i]
为 min(dp[i], dp[i - coin] + 1)
。dp[amount]
即为所需的最少硬币数量,如果仍为 float('inf')
,则表示无法兑换。通过这种方式,我们可以有效地将递归问题转换为迭代问题,从而提高算法的性能和稳定性。
领取专属 10元无门槛券
手把手带您无忧上云