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
|
||
|