如何从递归函数的所有子级中获取输出?

时间:2019-04-29 18:40:49

标签: octave

我正在尝试编写一个脚本来查找典型的最大流量问题中从源到接收器的所有路径。在将Ford-Fulkerson算法作为类项目的实现中,此总体操作将作为第一步。

我已经进行了一些基本的调试,但是似乎正在发生的事情是该算法并没有通过for循环产生应有的所有子代,而是只找到相同的路径几次然后终止。 / p>

#pathfinder
function final=pathFinder(A,path) #call with path=1 to initiate
    #A is a matrix that looks like
    # u v w where uv is an edge, and w is its weight (weight is used later)
    vert=path(numel(path)); #get last vertex used
    F=find(A(:,1)'==vert); #find incident edges
    disp("F is");
    disp(F); #displaying these for debugging purposes
    if(sum(F)==0) #terminates with no more edges (happens only at sink)
      #save externally
      disp("path found!");
      disp(path);
      final=0; #terminate it
    else
     for i=1:numel(F) #this should split this up in "children" for recursion, but it does not. Why?
        b=F(i);
        path=[path, A(b,2)]; #add new vertex/edge to path
        disp("non-final path");
        disp(path);
        disp("going deeper");
        final=pathFinder(A,path); #recurs on next vertex
     endfor
    endif
endfunction

我正在使用的示例图是

A=[1 2 0; 1 3 0; 2 3 0; 2 4 0; 3 4 0];

应具有路径[1 2 3 4],[1 2 4],[1 3 4](按算法顺序)。

1 个答案:

答案 0 :(得分:2)

您的代码有两个问题:

  1. vert=path(numel(path))说,路径中的元素数量是您要从其开始的顶点索引。错了您需要使用vert=path(end),即路径中的最后一个元素。

  2. 在循环中,您更新path。因此,下一次循环迭代将使用修改后的path,而不是回溯。您需要将path输入修改为下一个递归调用,而不是本地path变量。

这是更正的代码:

function pathFinder(A,path) % call with path=1 to initiate
   % A is a matrix that looks like
   %  u v w where uv is an edge, and w is its weight (weight is used later)
   vert=path(end); % get last vertex used
   F=find(A(:,1)'==vert); % find incident edges
   if isempty(F) % terminates with no more edges (happens only at sink)
      % save externally
      disp(path);
   else
      for b=F % loop over the incident edges
         pathFinder(A,[path, A(b,2)]); % recurse on next vertex
      end
   end
end

为简洁起见,我删除了调试输出。我还将一些仅使用八度音阶的内容(endfor#注释)更改为也可以在MATLAB中运行的内容。