递归路径计数

时间:2016-12-24 19:58:10

标签: python recursion path

我试图用递归函数计算路径 如果例如我有给定的指示

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:)

`

由这张照片代表 enter image description here

在此示例中,来自机器人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) 64个路径。

这是我到目前为止所尝试的但我没有成功

(4-5-1, 4-5-7-2, 4-5-7-3, 4-6-7-2, 4-6-7-3, 4-6-4)

3 个答案:

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