Python可乐找零程序中amount_due函数为何在owed≤0时返回None而非应找零金额?
问题分析:递归函数未返回值导致None输出
你的代码出现这个问题的核心原因是递归调用时没有返回递归函数的结果,导致最终上层函数接收到的是None而非正确的找零金额。
咱们仔细拆解amount_due函数的逻辑:
当owed > 0时,你调用了amount_due(check(owed), owed),但没有用return把这个调用的结果传递回去。这就好比你让下属去办一件事,下属最后拿到了结果,但没把结果交给你——最内层的递归确实算出了正确的找零金额,但上层的递归函数没有把这个值往上传,执行完递归调用后就默认返回了None。
另外还有两个小细节需要调整:
check函数里的打印文本拼写错误(Amout应该是Amount);- 当用户投入的金额超过50美分时,
owed会变成负数,直接返回负数作为找零不符合逻辑,应该返回它的绝对值。
修复后的完整代码如下:
def main(): owed = 50 coin = check(owed) rem = amount_due(coin, owed) print(f"Change Owed: {rem}") # 验证插入的硬币是否为有效面额 def check(owed): valid_coins = [25, 10, 5] while True: print(f"Amount Due: {owed}") coin = int(input("Insert Coin: ").strip()) if coin in valid_coins: return coin # 计算剩余金额或找零 def amount_due(coin, owed): owed -= coin if owed <= 0: return abs(owed) # 返回正数找零,符合实际逻辑 else: return amount_due(check(owed), owed) # 关键:添加return传递递归结果 main()
关键修复点就是在amount_due的else分支加上return,让递归的结果能够逐层向上传递,最终回到main函数的rem变量里,这样就能正确输出找零金额了。
内容的提问来源于stack exchange,提问作者Odai Kiwan
相关产品推荐
相关产品推荐

