我试图用递归函数计算路径 如果例如我有给定的指示
withPath' :: Tree a -> Tree (a, [a])
withPath' t = go id t where
go f (Node v xs) = Node (v, f' []) (map (go f') xs) where
f' = f . (v:)
`
在此示例中,来自机器人instructions = {
1: (('bot', 3), ('bot', 4)),
2: (('bot', 4), ('output', 0)),
3: (('output', 5), ('bot', 5)),
4: (('bot', 5), ('bot', 6)),
5: (('output', 1), ('bot', 7)),
6: (('bot', 7), ('output', 4)),
7: (('output', 2), ('output', 3))
}
3
的路径为5
。机器人(5-1, 5-7-2, 5-7-3)
6
有4
个路径。
这是我到目前为止所尝试的但我没有成功
(4-5-1, 4-5-7-2, 4-5-7-3, 4-6-7-2, 4-6-7-3, 4-6-4)
答案 0 :(得分:0)
为了清楚起见,我将名称从bot更改为节点 - 表示连接到其他点的点,输出到end - 表示不连接前进的点
instructions = {1: (('node', 3), ('node', 4)),
2: (('node', 4), ('end', 0)),
3: (('end', 5), ('node', 5)),
4: (('node', 5), ('node', 6)),
5: (('end', 1), ('node', 7)),
6: (('node', 7), ('end', 4)),
7: (('end', 2), ('end', 3))}
def count_path(current_node, instructions):
connections = instructions[current_node]
paths = 0
for connection in connections:
if connection[0] == "node":
paths += count_path(connection[1])
elif connection[0] == "end":
paths += 1
return paths
基本上,递归的工作原理是检查连接到当前点的点是"node"
还是"end"
,如果它们是节点,则创建一个新堆栈(即调用该函数)再次)但是从连接到新当前节点的节点开始,然后检查连接到新节点的那些点是否也是节点。
这一直持续到达"end"
为止。发生这种情况时,1
会添加到paths
。当前堆栈中到达的路径数将返回到上面的堆栈。
递归可能难以可视化,但基本上当您到达终点并向上移回堆栈时,您将返回该方向上的终点总数,因此顶部堆栈将返回结束点的总数(相当于路径总数)。
答案 1 :(得分:0)
您需要从count_path添加返回的值并删除while = true
。
def count_path(bot, instructions):
counter = 0
b = "bot"
outp = "output"
for x, y in instructions[bot]:
if x == b:
counter += count_path(y, instructions)
else:
counter += 1
return counter
在 Recursion 中你有一个基本情况,在你的情况下是你遇到一个死胡同,即output
元素。
假设你是机器人a
,如果下一个元素是僵尸b
,那么
no. path from bot a += no. of paths from bot b
否则,如果下一个元素是输出,则添加一个,因为这是您正在计算的其中一个路径的终止。
答案 2 :(得分:0)
这是一个简单但有效的解决方案。但是它只计算路径但不收集它们。
instructions = {
1: (('bot', 3), ('bot', 4)),
2: (('bot', 4), ('output', 0)),
3: (('output', 5), ('bot', 5)),
4: (('bot', 5), ('bot', 6)),
5: (('output', 1), ('bot', 7)),
6: (('bot', 7), ('output', 4)),
7: (('output', 2), ('output', 3))
}
def count_paths(bot):
n_paths = 0
entry = instructions[int(bot)]
for path_type, bot_number in entry:
if path_type == 'output':
n_paths += 1
elif path_type == 'bot':
n_paths += count_paths(bot_number)
return n_paths
if __name__ == '__main__':
bot = input("Count path for: ")
paths = count_paths(bot)
print("For bot {bot} there are {paths} paths".format(bot=bot, paths=paths))