C# 从List<T>获取所有组合的递归实现存在重复项问题求解
问题原因
你标注FIXME的行存在逻辑错误:previous 是上一层递归已经选定的组合前缀,和当前层遍历board的索引i没有关联,调用previous.Skip(i)属于无意义操作,会随机截断已选定的前缀内容,导致不同递归分支生成相同的组合内容,最终出现重复。
你代码里newBoard = board.Skip(i + 1).ToList()的逻辑是正确的,这个操作保证了后续递归只会处理当前元素之后的卡片,本质就是为了避免组合重复,和这个逻辑配套的前缀处理应该是完整保留之前已经选定的所有元素,再追加当前选中的卡片,不需要做任何截断。
修正方案
直接把FIXME行替换为复制previous全量元素即可,修改后代码如下:
private List<List<Card>> GetComboCards(List<Card> previous, List<Card> board, List<List<Card>> combos) { for (int i = 0; i < board.Count; i++) { Card card = board[i]; // 修正:直接复制之前的前缀,不做截断 List<Card> newPrevious = previous.ToList(); newPrevious.Add(card); combos.Add(newPrevious); List<Card> newBoard = board.Skip(i + 1).ToList(); GetComboCards(newPrevious, newBoard, combos); } return combos; }
修改后可以正确生成所有不重复的非空组合,4张卡片的场景下返回15个完全不重复的组合,符合预期。
内容的提问来源于stack exchange,提问作者henz90
相关产品推荐
相关产品推荐

