我正在通过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
值相同?
答案 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
}),然后你可以删除第一个循环,只有第二个循环。