使用while循环与递归函数计算n场游戏最小投注额的问题求助
问题分析与修复方案
首先看你遇到的两个核心问题:
- itertools.product迭代器只能用一次:你在函数外定义的
data是一个迭代器,第一次遍历for ticket in data之后,这个迭代器就被耗尽了,后续再遍历它的时候不会有任何元素,这就是为什么第二次重试时没有输出、最后返回空列表的根本原因。 - 递归调用打断了while循环的逻辑:你在else分支里直接
return Product(),这会重新启动一个新的函数调用,新调用里的x又会被初始化为1,而且当前的while循环直接终止,完全没发挥它的重试作用。
修复后的代码
from itertools import product def check(list1, val): possible_return = [] for lst in list1: possible_return.append(lst[-1]) return all(i > val for i in possible_return) def Product(): x = 1 # 把x的初始化放在while循环外,保证每次重试都基于上一次的x递增 while True: # 每次循环都重新生成product迭代器,避免迭代器被耗尽 data = product( (('home1', 1.53), ('away1', 2.4)), (('home2', 1.53), ('away2', 2.4)), (('home3', 1.653), ('away3', 2.4)), (('home4', 1.653), ('away4', 2.4)), (('home5', 1.653), ('away5', 2.4)), ) dict_of_tickets = {} list_of_tickets = [] total_Stake = 0 list_of_Odds = [] pay_out_list = [] for ticket in data: TOTAL_ODDS = 1 n = 2 ** len(ticket) for i in ticket: TOTAL_ODDS = round((TOTAL_ODDS * i[1]), 3) list_of_Odds.append(TOTAL_ODDS) odd_per_ticket = TOTAL_ODDS if odd_per_ticket <= n: stake = ((n / odd_per_ticket) * x) else: stake = x / 2 pay_out = round(((odd_per_ticket + odd_per_ticket/4) * stake), 0) pay_out_list.append(pay_out) total_Stake += stake reciept = [ticket, odd_per_ticket, stake, pay_out] list_of_tickets.append(reciept) if check(list_of_tickets, total_Stake): return list_of_tickets else: print("Trying again....!", total_Stake) x *= 1.5 # 直接递增x,继续下一轮while循环,不需要递归 # 调用函数 result = Product() print(result)
关键修改点说明
- 每次循环重新生成data:把
data = product(...)放到while循环内部,这样每一次重试都会得到一个全新的、未被遍历过的迭代器,保证能拿到所有的ticket组合。 - 移除递归调用:去掉else分支里的
return Product(),直接让while循环继续执行,这样x的值会持续在上一次的基础上乘以1.5,而不是每次重置为1。 - x的初始化位置调整:把
x=1放在while循环外面,确保重试时x是递增的,而不是每次循环都重新回到1。 - 简化stake的赋值逻辑:把stake的判断逻辑合并,减少重复代码,让结构更清晰。
这样修改后,代码会不断重试并输出每次的total_Stake,直到满足check函数的条件,然后返回正确的投注列表。
内容的提问来源于stack exchange,提问作者mad
相关产品推荐
相关产品推荐

