62 lines
1.5 KiB
Python
62 lines
1.5 KiB
Python
|
"""
|
|||
|
递归三定律:
|
|||
|
1 递 归 算 法 必 须 具 有 基 本 情 况
|
|||
|
2 递 归 算 法 必 须 向 基 本 情 况 靠 近
|
|||
|
3 递 归 算 法 必 须 以 递 归 方 式 调 用 自 身
|
|||
|
"""
|
|||
|
|
|||
|
def recursive_sum(nums: list):
|
|||
|
if 1 == len(nums):
|
|||
|
return nums[0]
|
|||
|
|
|||
|
return nums[0] + recursive_sum(nums[1:])
|
|||
|
|
|||
|
|
|||
|
# 使用递归的方式实现进制转换
|
|||
|
def recursive_num_conversion(num: int) -> str:
|
|||
|
if num == 0:
|
|||
|
return ''
|
|||
|
|
|||
|
return recursive_num_conversion(num // 2) + str(num % 2)
|
|||
|
|
|||
|
|
|||
|
# 找零问题:类似贪婪,经量找出最少纸币搭配
|
|||
|
def rec_mc1(changes: list[int], cash: int):
|
|||
|
# 全用1元纸币时最少找零数
|
|||
|
min_amount = cash
|
|||
|
|
|||
|
try:
|
|||
|
if changes.index(cash):
|
|||
|
return 1
|
|||
|
except Exception as e:
|
|||
|
for c in changes:
|
|||
|
# cash - c,表示使用了一张面额为c的来找零,所以需要+1
|
|||
|
num = 1 + rec_mc1(changes, cash-c)
|
|||
|
|
|||
|
if num < min_amount:
|
|||
|
min_amount = num
|
|||
|
|
|||
|
return min_amount
|
|||
|
|
|||
|
|
|||
|
def rec_mc2(changes: list[int], cash: int, min_changes: int,):
|
|||
|
min_amount = cash
|
|||
|
|
|||
|
try:
|
|||
|
if changes.index(cash):
|
|||
|
min_changes[cash] = 1
|
|||
|
return 1
|
|||
|
except Exception as e:
|
|||
|
if min_changes[cash] > 0:
|
|||
|
return min_changes[cash]
|
|||
|
else:
|
|||
|
for c in changes:
|
|||
|
num = 1 + rec_mc2(changes, cash - c, min_changes)
|
|||
|
|
|||
|
if num < min_amount:
|
|||
|
min_amount = num
|
|||
|
min_changes[cash] = min_amount
|
|||
|
|
|||
|
return min_amount
|
|||
|
|