求助:递归实现指定大小的整数子集生成函数
问题:生成{1,2,…,n}中大小为k的子集字符串列表
需要实现递归函数subsets_size_k(n, k),接收两个整数n和k,返回集合{1,2,…,n}中所有大小为k的子集组成的列表。每个子集需用成员按升序排列的字符串表示,允许的前提条件为0≤k≤n且1≤n≤9,且仅可使用len函数,不可使用其他方法、循环或函数。
示例:
- 调用
subsets_size_k(5,3)应返回类似['123', '124', ..., '345']的列表; - 调用
subsets_size_k(5,0)应返回['']。
你尝试的错误代码
def k_sum_subset(n, k): if k == 0: return [] if k == 1: return base_case(n) return k_sum_subset(n, k-1) + k_sum_subset(n-1, k-1) def base_case(n): if n == 1: return [1] if n == 2: return [[1], [2]] if n == 3: return [[1], [2], [3]] if n == 4: return [[1], [2], [3], [4]] if n == 5: return [[1], [2], [3], [4], [5]] if n == 6: return [[1], [2], [3], [4], [5], [6]] if n == 7: return [[1], [2], [3], [4], [5], [6], [7]] if n == 8: return [[1], [2], [3], [4], [5], [6], [7], [8]] if n == 9: return [[1], [2], [3], [4], [5], [6], [7], [8], [9]]
错误输出
[[1], [2], [3], [4], [5], [1], [2], [3], [4], [1], [2], [3], [4], [1], [2], [3]]
问题分析与修正方案
你的代码存在三个核心问题:
- 递归逻辑错误:当前递归式完全不符合子集生成逻辑,正确思路应为:包含n的k大小子集,是{1,..,n-1}中k-1大小的子集每个都追加n;不包含n的k大小子集,直接是{1,..,n-1}中k大小的子集,两者合集才是结果。
- 数据类型混乱:base_case返回整数或嵌套列表,和最终需要的字符串类型不统一,导致输出混乱。
- 边界条件错误:k=0时题目要求返回
[''],你返回了空列表。
修正后的代码
def subsets_size_k(n, k): # 边界条件:k=0时返回包含空字符串的列表 if k == 0: return [''] # 边界条件:k等于n时,只有一个子集即所有元素组成的字符串 if k == n: return [''.join(str(i) for i in range(1, n+1))] # 递归分两种情况:包含n的子集 和 不包含n的子集 include_n = [s + str(n) for s in subsets_size_k(n-1, k-1)] exclude_n = subsets_size_k(n-1, k) # 合并两种情况的结果 return include_n + exclude_n
说明
- 边界处理严格贴合题目要求,k=0返回
[''],k=n返回唯一的全元素字符串。 - 递归逻辑保证生成的子集天然升序:递归生成的子集本身是升序,追加n只会在末尾,不会破坏顺序。
- 所有返回结果均为字符串列表,完全符合输出要求。
测试验证
- 调用
subsets_size_k(5,3)会返回:['123', '124', '134', '234', '125', '135', '235', '145', '245', '345'],符合预期。 - 调用
subsets_size_k(5,0)返回[''],正确。
内容的提问来源于stack exchange,提问作者Nitai
相关产品推荐
相关产品推荐

