无需itertools.product,实现动态输入N次硬币翻转的所有组合
不用itertools.product实现动态N次硬币翻转的所有组合
嘿,这个问题我之前也纠结过!不用itertools.product完全能搞定,核心就是绕开写死的嵌套循环——毕竟输入N是动态的,没法提前写好N层循环,这时候用递归或者迭代构建结果集就能完美解决。
方法一:递归法(最直观对应嵌套循环逻辑)
递归的思路很简单:把N次翻转的问题拆解成「N-1次翻转的所有组合」加上「最后一次的H/T」。比如N=2时,先拿N=1的['H','T'],每个结果分别加H和T,就得到['HH','HT','TH','TT']。
代码示例:
def generate_flips(n): # 基线情况:1次翻转只有两种结果 if n == 1: return ['H', 'T'] # 先获取n-1次翻转的所有组合 previous = generate_flips(n - 1) # 给每个组合追加H和T,生成新的结果 current = [] for combo in previous: current.append(combo + 'H') current.append(combo + 'T') return current # 动态输入N n = int(input("请输入硬币翻转次数N: ")) # 打印所有组合 for result in generate_flips(n): print(result)
递归相当于把“嵌套循环”的层数交给函数调用栈来处理,不管N是3还是10,都能自动生成对应深度的组合。
方法二:迭代法(避免递归栈溢出,适合大N)
如果担心N太大导致递归栈溢出,迭代法更稳妥。思路是从空结果开始,每次循环给现有所有组合追加H和T,循环N次就得到最终结果。
代码示例:
n = int(input("请输入硬币翻转次数N: ")) # 初始状态:0次翻转的结果是空字符串 combinations = [''] for _ in range(n): temp = [] # 遍历当前所有组合,分别追加H和T for combo in combinations: temp.append(combo + 'H') temp.append(combo + 'T') # 更新组合列表为新的结果 combinations = temp # 输出所有可能的翻转组合 for combo in combinations: print(combo)
比如第一次循环后,combinations变成['H','T'];第二次循环变成['HH','HT','TH','TT'],以此类推,每一次循环都相当于“加一层”翻转,完全模拟了动态嵌套循环的效果。
这两种方法都不需要依赖任何内置工具,纯靠基础逻辑就能实现动态N的需求~
内容的提问来源于stack exchange,提问作者Sandeep
相关产品推荐
相关产品推荐

