You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用while循环与递归函数计算n场游戏最小投注额的问题求助

问题分析与修复方案

首先看你遇到的两个核心问题:

  1. itertools.product迭代器只能用一次:你在函数外定义的data是一个迭代器,第一次遍历for ticket in data之后,这个迭代器就被耗尽了,后续再遍历它的时候不会有任何元素,这就是为什么第二次重试时没有输出、最后返回空列表的根本原因。
  2. 递归调用打断了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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:54:35