在python

时间:2015-10-18 08:59:46

标签: python algorithm recursion depth

我正在做一些关于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')

结果:无限递归。我该如何解决?

2 个答案:

答案 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')