再谈递归

2020-10-16 03:59:31

否则,我们的路径必须使用图中所示的其中一条紫色边。此外,由于路径(和循环)不能重复顶点,因此一旦使用了这些紫色边中的一条,其他边就不能使用了,因为否则我们将返回顶点$u$。这是被禁止的。所以我们可以去掉紫色的边,然后对于每个红色的顶点,我们计算从那里到$v$的路径数。因此,让我们获得紫色边列表,并删除它们:对于紫色边中的边,如果e[0]==u或e[1]==u,则紫色边=[e for e in graph_edges if e[0]==u或e[1]==u]:del graph_edge[edge]。

然后我们就会得到红色顶点的列表。如果e[0]==u],则对于紫色边缘中的e,红色顶点=[e[1];如果e[1]==u,则对于紫色边缘中的e,红色顶点=[e[1])。

从$u$到$v$的路径总数是从红色顶点到$v$的路径总数。因此,我们通过递归调用相同例程来求和:最后,我们将所有这些边放回原处,并返回我们的结果:def count_path(graph_edges,u,V):if u==v:对于紫色边缘中的边,如果e[0]==u或e[1]==u,则返回1紫色边缘=[e对于graph_edges中的e,或者e[1]==u]。对于紫色边缘中的e,如果e[0]==u,则返回1紫色边缘中的e;如果e[1]==u,则返回1紫色边缘中的e;对于red_vertex中的red_vertex,如果e[1]=u,则返回[e[0];对于red_vertex中的red_vertex,总计=0;对于red_vertex中的red_vertex,总计+=count_path(graph_edges,red_vertex,V)对于紫色边缘中的边:GRAPH_EDGES[EDGE]=1返回totaldef COUNT_COUNDS(GRAPH_EDGES):如果不是GRAPE_EDGES:返回0 SELECTED_EDGE=CHOOSE_EDGE(GRAPH_EDGES)del GRAPH_EDGE[SELECTED_EDGE]Cycle_Without=COUNT_CORLES(GRAPH_EDGE)u,v=vertices_of_edge(SELECTED_EDGE)CYCLES_WITH=count_path(graph_Edges,u,v)graph_Edgees[SELECTED_EDGE]=1返回COUNT_PAT