如何用递归实现支持任意长度的多层嵌套循环与赋值(向量位运算场景)
用递归实现任意长度向量的位逻辑匹配
核心思路
递归的关键是逐层处理相邻的vector_set对,每次递归时维护两个核心状态:
- 当前累积的位运算结果
current_d - 已经填充的
values数组
一旦找到满足d2.sum() == 0的索引组合,就立即给values赋值,并递归处理下一组vector_set,直到遍历完所有需要处理的组或找到有效解。
递归实现代码
import numpy as np def find_matching_indices(vector_setS, current_idx, current_d, values): # 终止条件:所有相邻vector_set对处理完成 if current_idx >= vector_setS.shape[0] - 1: return True # 确定当前r的遍历范围:首次遍历全量256个值,后续复用已确定的values值 r_range = range(256) if current_idx == 0 else [values[-(current_idx + 2)]] for r in r_range: for a in range(256): # 计算当前组合的位运算结果 combined_vec = np.bitwise_and(vector_setS[current_idx, r], vector_setS[current_idx+1, a]) new_d = np.bitwise_and(current_d, combined_vec) if new_d.sum() == 0: # 赋值到values对应位置 values[-(current_idx + 2)] = r values[-(current_idx + 1)] = a # 递归处理下一组vector_set if find_matching_indices(vector_setS, current_idx + 1, new_d, values): return True # 找到有效解后直接回溯返回 return False # 当前分支无有效解
调用示例(适配任意长度DO)
# 示例:DO长度为4的情况(和你原代码一致) DO = [137,80,78,71] values = np.zeros(len(DO), dtype=np.uint8) vector_setS = np.zeros((len(DO)-2, 256, 8192), dtype=np.uint8) A = np.ones(8192, dtype=np.uint8) B = np.zeros(8192, dtype=np.uint8) initial_d = np.bitwise_and(A, B) found = find_matching_indices(vector_setS, 0, initial_d, values) if found: print("符合条件的索引组合:", values) else: print("未找到有效组合")
适配任意长度的说明
- 不管DO的长度是多少,
vector_setS的形状会自动变为(len(DO)-2, 256, 8192),递归函数会根据这个形状自动处理所有需要的层级,不需要手动添加for循环。 - 递归过程中,
values数组会被实时修改,找到有效组合时会直接填充对应位置的索引。
内容的提问来源于stack exchange,提问作者Yume
相关产品推荐
相关产品推荐

