使用Recursion开发Ping/Tracert模拟器时路径拼接异常问题求助
问题原因定位
- 核心问题1:递归层级未正确返回拼接完成的路径。子递归返回有效路径后,当前层级没有将拼接好的
path作为返回值返回,反而在函数末尾统一返回了空字符串'',导致上层拼接路径时拿到的是空值,最终最外层的facebook.com后面拼接了空内容,出现facebook.com/的错误输出。 - 核心问题2:缺少递归短路逻辑。找到匹配目标的路径后,没有直接终止遍历返回结果,函数会继续遍历完所有连接后才执行末尾的
return '',丢失了已经拼接好的正确路径。
修复后的代码实现
# 初始化连接列表 connection_list = [] connection_list.append(('facebook.com', 'google.com')) connection_list.append(('google.com', 'instagram.com')) connection_list.append(('instagram.com', 'example2.com')) # 访问标记列表,每次调用前清空避免历史数据干扰 visited_list = [] def ping(origin, destination): path = origin for connect in connection_list: if origin in connect: # 找到直达目标的连接,直接拼接返回 if destination in connect: print('Ping to server', destination, 'success') visited_list.append((origin, connect[1])) path = path + '/' + connect[1] return path # 未访问过的连接,递归向下查找 if connect not in visited_list: visited_list.append(connect) # 确定下一跳节点 next_node = connect[1] if connect[0] == origin else connect[0] sub_path = ping(next_node, destination) # 子递归返回有效路径,拼接后直接返回,终止后续遍历 if sub_path: path = path + '/' + sub_path return path # 无有效路径时返回空 return ''
调用测试
visited_list = [] result = ping('facebook.com', 'example2.com') print(result)
输出结果
Ping to server example2.com success facebook.com/google.com/instagram.com/example2.com
注:如果需要多次调用
ping函数,建议将visited_list改为函数参数传递,避免全局变量残留的历史访问标记影响后续调用结果。
内容的提问来源于stack exchange,提问作者ThangTu
相关产品推荐
相关产品推荐

