递归Python函数返回None Always

时间:2015-05-26 23:05:21

标签: python algorithm graph return-value

因此,我正在实施一种算法,在对该图中的查找周期进行较重的计算之前,从图中修剪叶节点。我将图表表示为邻接列表,我将使用的示例是与甲苯中的碳相对应的图表:

[[0, 1], [0, 2], [1, 3], [2, 4], [3, 5], [4, 5], [5, 6]]

我想删除与连接叶节点的边相对应的条目,因此需要“修剪”边[5,6]以生成这个新的邻接列表:

[[0, 1], [0, 2], [1, 3], [2, 4], [3, 5], [4, 5]]

下面的代码(Python 3.4)似乎正确执行此操作,因为当我在函数中打印输出正确的邻接列表时。但是,当我调用函数并打印返回的“值”时,它总是None

def prune_adj_list(adj_list):
    print(adj_list)
    all_indices = []
    for bond in adj_list:
        all_indices = all_indices + bond
    leaf_nodes = []
    for value in range(min(all_indices),max(all_indices)+1):
        if all_indices.count(value) == 1: #count how many bonds to node
            leaf_nodes.append(value)
    if len(leaf_nodes) == 0: # no leaf nodes so done
        print("done pruning")
        print(adj_list) #<- the value here is correct
        return adj_list
    else:
        new_adj_list = []
        for bond in adj_list:
            if not (leaf_nodes.count(bond[0]) > 0 or leaf_nodes.count(bond[1]) > 0):
                new_adj_list.append(bond)
        if len(new_adj_list) > 0:
            prune_adj_list(new_adj_list)
        else:
            print("pruned away entire graph")
            return []

以下是打印“无”而不是正确值的调用示例。

def find_cycles(compound):
    adj_list = make_adj_list(compound) # this produces the list:     [[0, 1], [0, 2], [1, 3], [2, 4], [3, 5], [4, 5], [5, 6]] 
    print(adj_list)
    print(prune_adj_list(adj_list))

有人可以向我解释为什么返回值不正确但是当我在返回之前打印它是正确的吗?还有关于如何解决这个问题的任何建议?我已经使用了adj_list的返回副本,并测试了代码似乎正在执行我想要的操作。

在此先感谢,如果需要其他信息,请告知我们。

2 个答案:

答案 0 :(得分:3)

您的递归案例缺少return

if len(new_adj_list) > 0:
    return prune_adj_list(new_adj_list)
    ^^^^^^
else:
    print "pruned away entire graph"
    return []     

答案 1 :(得分:1)

可以添加

return prune_adj_list(new_adj_list)

在if条件下而不是

prune_adj_list(new_adj_list)