使大小为k的所有组合从1到数字n

时间:2019-01-07 02:54:01

标签: python python-3.x dfs

给出两个数字n和k,您必须找到1…n中k个数字的所有可能组合。我正在使用DFS算法实现这一点。但是我的ans数组返回None,而如果我尝试打印temp,则组合生成正确。我究竟做错了什么 ? 在Geeks for Geeks的此链接中,它对于C ++正常工作

这是我的代码:

def DFSUtil(ans, temp, n, left, k):
    if k == 0:
        ans.append(temp)
        return

    for i in range(left, n+1):
        temp.append(i)
        DFSUtil(ans, temp, n, i+1, k-1)
        temp.pop()


def DFS(n, k):
    ans = []
    temp = []
    DFSUtil(ans, temp, n, 1, k)
    return ans

n = 5
k = 3
ans = DFS(n, k)
for i in range(len(ans)):
    for j in range(len(ans[i])):
        print(ans[i][j], end=' ')
    print()

预期工作:

Input : n = 4 
        k = 2
Output : 1 2 
         1 3 
         1 4 
         2 3 
         2 4 
         3 4

2 个答案:

答案 0 :(得分:3)

您正在修改temp列表,该列表作为参考传递。您应该递归传递temp的副本,例如:

DFSUtil(ans, temp.copy(), n, i+1, k-1)

答案 1 :(得分:1)

您需要附加相关数据的副本,而不是像这样的可变列表本身:

附加副本

if not(ans and ans[-1] == temp[:-1]):
    ans.append(list(temp[:-1]))

测试代码:

def DFSUtil(ans, temp, n, left, k):
    if k == 0:
        if not(ans and ans[-1] == temp[:-1]):
            ans.append(list(temp[:-1]))
        return

    for i in range(left, n + 1):
        temp.append(i)
        DFSUtil(ans, temp, n, i + 1, k - 1)
        temp.pop()


def DFS(n, k):
    ans = []
    temp = []
    DFSUtil(ans, temp, n, 1, k)
    return ans


n = 5
k = 3
ans = DFS(n, k)
for i in range(len(ans)):
    for j in range(len(ans[i])):
        print(ans[i][j], end=' ')
    print()

结果:

1 2 
1 3 
1 4 
2 3 
2 4 
3 4