我正在做一些关于udacity的练习问题,并且必须编写一些递归代码来查找节点中朋友的路径。我想出了这个。但是,递归定义缺少一个停止条件,我认为在哪里找不到连接。我该如何解决?
def path_to_friend(network, user_A, user_B,traversed = None):
if traversed is None:
traversed = []
if (user_B in network and user_A in network):
if user_B in get_connections(network,user_A):
return [user_A] + [user_B]
else:
for conn in get_connections(network,user_A) :
if conn in traversed:
continue
else:
traversed.append(conn)
return [user_A] + path_to_friend(network,conn,user_B)
else:
return None
网络的数据结构:{' Bob':[[' Carol'],[]],' Alice':[[' Bob& #39;],[]],' Carol':[[' Bob'],[]]}
查找:path_to_friend(网络,' Bob',' Alice')
结果:无限递归。我该如何解决?
答案 0 :(得分:0)
这行代码可能会导致问题:
return [user_A] + path_to_friend(network,conn,user_B)
基本上,只要找到尚未访问过的任何连接,就会运行此代码。因此,代码将在第一个非访问路径中搜索连接,而不搜索其他路径。
c ---- e
/
a ---- b
\
d
如果您从a和目标节点开始是e,那么您的代码将只会到达e,如果c出现在get_connections(network , b)
中的d之前,否则代码将在d结束。甚至没有定义此行为/执行路径不以return
- 语句结束。
最简单的解决方案是简单地返回None
,如果路径结束而没有找到节点:
for conn in get_connections(network,user_A) :
if conn in traversed:
continue
else:
traversed.append(conn)
tmp = path_to_friend(network , conn , user_B)
if (tmp is not None):
return [user_A] + tmp//a matching path was found
//no matching path was found -> return none
return None
代码的下一个问题:你没有将遍历列表从一个调用保持到下一个调用,因此每次调用该函数时,traversed is None
都成立。使用每个调用的遍历列表作为后续调用的参数:
path_to_friend(network,conn,user_B, traversed)
答案 1 :(得分:0)
def path_to_friend(network, user_A, user_B,traversed = None):
if traversed is None:
traversed = []
if (user_B in network and user_A in network):
if user_B in network[user_A][0] :
return [user_A] + [user_B]
else:
for conn in network[user_A][0] :
if conn in traversed:
continue
else:
traversed.append(conn)
temp = path_to_friend(network,conn,user_B,traversed)
if (temp is not None):
return [user_A] + temp
return None
else:
return None
network = {'Bob': [['Carol'], []], 'Alice': [['Bob'], []], 'Carol': [['Bob'], []]}
path_to_friend(network,'Bob','Alice')