递归实现带概率随机选择的列表模拟器,解决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)
逻辑说明
- 外层函数
run_multiple_simulations初始化结果列表results,并保存当前模拟的输入列表current_lst - 循环k次:每轮调用
simulator生成新列表,将新列表更新为下一轮的输入,同时加入结果列表 - 循环结束后返回包含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)
逻辑说明
- 递归函数通过参数
k控制剩余模拟轮数,当k=0时停止递归并返回结果 - 每轮递归生成新的模拟列表,加入结果列表后,将新列表和
k-1作为参数传入下一次递归
为什么你之前的尝试会报错?
你直接将simulator的返回值改为simulator(sim),既没有设置终止条件,也没有收集结果,会导致函数无限递归调用自己,最终触发栈溢出错误。必须在外层控制模拟轮数,并主动收集每一轮的结果才能实现需求。
内容的提问来源于stack exchange,提问作者hodowcanietoperzy
相关产品推荐
相关产品推荐

