递归和Python词典

时间:2013-12-03 00:26:07

标签: python recursion

我正在通过Udacity的计算机科学课程入门。

对于问题集,我需要确定链接是否是互惠的。 A - >的链接如果存在来自B的k个链接,则B被认为是倒数的。 A.

例如。如果k = 2,则B-> A将被计为节点A的倒数链路(如果存在)  路径A-> C-> B,对于某些页面C,(长度为2的链路路径),  或直接链接A-> B(长度为1的链接路径)。

这是我正在使用的“互联网”问题。它只是一个字典,其中键是一个URL,值是该页面上的链接列表。

g = {'a': ['a', 'b', 'c'], 'b':['a','e'], 'c':['d'], 'd':['a'], 'e':['c']} 

现在这里是我正在处理的辅助函数,理想情况下会返回一个布尔值,具体取决于是否link_a - > link_b是互惠的。

def is_reciprocal(g,link_a,link_b,k):
    """
    Returns True if link_a --> link_b is reciprocal
    """
    url_links = []
    print " "
    print "link_a is...",link_a
    print "link_b is...",link_b
    print "k is...",k
    print 
    if k == -1:
        return False
    for i in g[link_b]:
        if i == link_a:
            return True

    return is_reciprocal(g,link_a,g[link_b][0],k-1)

这是我正在做的测试值。

t1 = is_reciprocal(g1,'e','c',4)

打印出来......

link_a is... e
link_b is... c
k is... 4


link_a is... e
link_b is... d
k is... 3


link_a is... e
link_b is... a
k is... 2


link_a is... e
link_b is... a
k is... 1


link_a is... e
link_b is... a
k is... 0


link_a is... e
link_b is... a
k is... -1

似乎当link_b'a'时,相同的link_b会继续使用。

我的问题:
有没有办法递归排序dict并使link_b等同于g['a']中的所有值,同时保持k值相同?

1 个答案:

答案 0 :(得分:1)

  

似乎当link_b为'a'时,相同的link_b会继续使用。

这并不奇怪,因为您的递归调用显式只使用第一个值:

return is_reciprocal(g,link_a,g[link_b][0],k-1)

如果要使用所有值,则需要递归每个值,直到其中一个值为True。像这样:

for i in g[link_b]:
    if is_reciprocal(g,link_a,i,k-1):
        return True

但是,您可能会注意到现在连续两个几乎相同的循环。如果您更改递归基本案例以便为您处理i == link_a案例(这很简单:如果False而不是返回k == -1,则只需返回link_a == link_b k == 0 }),然后你可以删除第一个循环,只有第二个循环。