如何扩展递归逻辑或用Python函数生成n×n的0-1二维数组全组合?
生成n×n的0-1二维数组方案
一、基于现有递归逻辑扩展
你现有的一维递归代码核心是遍历每个位置,依次尝试0和1的取值。要扩展到二维数组,有两种递归思路:
思路1:将二维数组转为一维处理
把n×n的二维数组看作长度为n²的一维数组,用原递归逻辑生成所有一维组合后,再拆分成二维结构:
def generate_all_2d_spin_configs(n): def helper(total, arr, l, i): if i == total: # 将一维数组拆分为n行n列的二维数组 two_d_arr = [arr[i*n : (i+1)*n] for i in range(n)] l.append(two_d_arr) return arr[i] = 0 helper(total, arr, l, i+1) arr[i] = 1 helper(total, arr, l, i+1) return l total_elements = n * n arr = [None] * total_elements result = [] return helper(total_elements, arr, result, 0) # 示例调用:生成2×2的所有0-1二维数组 n = 2 configs = generate_all_2d_spin_configs(n) for cfg in configs: print(cfg)
思路2:直接递归遍历二维位置
直接针对二维数组的行和列索引进行递归,逐个位置填充0或1:
def generate_all_2d_spin_configs(n): def helper(row, col, current_arr, result): if row == n: # 所有行填充完成,添加当前数组的副本 result.append([r[:] for r in current_arr]) return # 尝试当前位置设为0 current_arr[row][col] = 0 # 计算下一个位置:列满则换行,否则同列前进 next_col = col + 1 next_row = row if next_col == n: next_row = row + 1 next_col = 0 helper(next_row, next_col, current_arr, result) # 尝试当前位置设为1 current_arr[row][col] = 1 helper(next_row, next_col, current_arr, result) # 初始化空的二维数组框架 initial_arr = [[None for _ in range(n)] for _ in range(n)] result = [] helper(0, 0, initial_arr, result) return result # 示例调用 n = 2 configs = generate_all_2d_spin_configs(n) for cfg in configs: print(cfg)
二、用Python标准库简化实现
如果不想自己写递归,可以用itertools.product生成笛卡尔积,一步到位生成所有组合:
import itertools def generate_all_2d_spin_configs(n): # 生成所有长度为n²的0-1组合(以元组形式返回) one_d_combinations = itertools.product([0, 1], repeat=n*n) # 将每个一维组合转换为二维数组 two_d_configs = [] for combo in one_d_combinations: two_d_arr = [list(combo[i*n : (i+1)*n]) for i in range(n)] two_d_configs.append(two_d_arr) return two_d_configs # 示例调用 n = 2 configs = generate_all_2d_spin_configs(n) for cfg in configs: print(cfg)
itertools.product是C实现的标准库函数,效率比纯Python递归更高,代码也更简洁,适合大多数场景。
注意:当n较大时(比如n≥4),总组合数会达到2^(n²),内存消耗会急剧上升,这是所有方案都无法避免的问题,使用时需注意n的取值范围。
内容的提问来源于stack exchange,提问作者q2w3e4
相关产品推荐
相关产品推荐

