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

递归实现带概率随机选择的列表模拟器,解决k次重复调用报错问题

解决方案:生成多轮模拟的列表的列表

你的核心需求是重复调用模拟器k次,每一轮以上一轮的输出作为输入,最终得到包含k个模拟列表的嵌套列表。之前直接在函数内递归调用自己却没设置终止条件,会导致无限递归报错,而且无法收集每一轮的结果,以下是两种可行的实现方式:

方法一:循环实现(直观易读)

通过外层函数管理多轮模拟的状态,逐步收集每一轮的结果:

import numpy as np

lst = ["a", "a", "a"]
rdm_lst = ["a", "b", "c"]

def simulator(lst, rdm_lst):
    sim = []
    for i in lst:
        if i == "a":
            sim.append(np.random.choice(rdm_lst, size=1, p=[0.6, 0.2, 0.2]).tolist()[0])
        elif i == "b":
            sim.append(np.random.choice(rdm_lst, size=1, p=[0.2, 0.6, 0.2]).tolist()[0])
        elif i == "c":
            sim.append(np.random.choice(rdm_lst, size=1, p=[0.2, 0.2, 0.6]).tolist()[0])
    return sim

def run_multiple_simulations(initial_lst, rdm_lst, k):
    results = []
    current_lst = initial_lst
    for _ in range(k):
        # 用当前列表生成下一轮模拟结果
        current_lst = simulator(current_lst, rdm_lst)
        # 收集本轮结果
        results.append(current_lst)
    return results

# 调用示例:生成3轮模拟结果
output = run_multiple_simulations(lst, rdm_lst, 3)
print(output)

逻辑说明

  1. 外层函数run_multiple_simulations初始化结果列表results,并保存当前模拟的输入列表current_lst
  2. 循环k次:每轮调用simulator生成新列表,将新列表更新为下一轮的输入,同时加入结果列表
  3. 循环结束后返回包含k个模拟列表的嵌套列表

方法二:递归实现(适合偏好递归逻辑的场景)

通过设置终止条件控制递归次数,同时传递结果列表收集每一轮数据:

import numpy as np

lst = ["a", "a", "a"]
rdm_lst = ["a", "b", "c"]

def simulator(lst, rdm_lst):
    sim = []
    for i in lst:
        if i == "a":
            sim.append(np.random.choice(rdm_lst, size=1, p=[0.6, 0.2, 0.2]).tolist()[0])
        elif i == "b":
            sim.append(np.random.choice(rdm_lst, size=1, p=[0.2, 0.6, 0.2]).tolist()[0])
        elif i == "c":
            sim.append(np.random.choice(rdm_lst, size=1, p=[0.2, 0.2, 0.6]).tolist()[0])
    return sim

def run_recursive_simulations(current_lst, rdm_lst, k, results=None):
    # 初始化结果列表(仅第一次调用时执行)
    if results is None:
        results = []
    # 终止条件:剩余轮数为0时返回结果
    if k == 0:
        return results
    # 生成本轮模拟结果
    current_lst = simulator(current_lst, rdm_lst)
    results.append(current_lst)
    # 递归调用:轮数减1,传入新的当前列表
    return run_recursive_simulations(current_lst, rdm_lst, k-1, results)

# 调用示例:生成3轮模拟结果
output_recursive = run_recursive_simulations(lst, rdm_lst, 3)
print(output_recursive)

逻辑说明

  1. 递归函数通过参数k控制剩余模拟轮数,当k=0时停止递归并返回结果
  2. 每轮递归生成新的模拟列表,加入结果列表后,将新列表和k-1作为参数传入下一次递归

为什么你之前的尝试会报错?

你直接将simulator的返回值改为simulator(sim),既没有设置终止条件,也没有收集结果,会导致函数无限递归调用自己,最终触发栈溢出错误。必须在外层控制模拟轮数,并主动收集每一轮的结果才能实现需求。

内容的提问来源于stack exchange,提问作者hodowcanietoperzy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 22:35:18