递归算法的魅力所在——图的遍历

最早接触递归算法是在大三,有一门课程叫做数据结构(头疼),在里面很多地方都要用到递归算法,

当时真的是没法好好的理解,所以连带着一些算法都没学好,最后也就不了了之了,直到最近,公司需要做一个图的遍历算法,这才体会到递归算法的魅力!

学过数据结构的应该都知道,图的遍历一般有两种算法:广度优先,深度优先。(其实这两个算法很相似,不同之处就在于递归的函数的位置以及递归结束的条件)

在这里我就不介绍这两种算法的原理了,因为在网上一找就是一大堆。下面具体介绍一下我做的这个递归:有向图的“深度”优先遍历。

请看下图:

《递归算法的魅力所在——图的遍历》

这是一个很复杂的有向图,一个开始节点,一个结束节点,要求就是从开始节点深度优先遍历,并要求每个节点只有等到它的父节点全部遍历完成才能被访问。在这里就要考虑到“汇合”节点什么时候该遍历了,其实也就是在递归函数里面加上一个判断机制:父节点是否已经全部遍历?

看看下面的伪代码(用python写的):

finished_list = []     //完成节点列表,存放已经遍历的节点,初始为空

function_name(id):

得到该节点的所有父节点pids;

for pid in pids:

if pid not in finished_list:    //循环判断,只要有一个不在完成列表中,就退出

return

finished_list.append(id)    //如果父节点全部在完成列表中,就可以遍历

得到该节点的所有子节点cids;

for cid in cids:                   //他所有的子节点循环进行递归

function_name(c_id)   

上面这段代码中,有两个退出情况:1.父节点不全在完成列表中 2.当一个节点没有子节点,或者说没有下一个节点。

多么简单的代码,只需输入开始节点id号,就可以把整个流程图有条不紊的输出(结果当然是保存在finished_list中喽),如果说复杂,就在加粗斜体的那两行吧,这样根据具体的开发背景和环境来决定怎么写,有的可能是在矩阵中查找,有的也可能是在数据库中查找。

楼主再多说一句话:写完才知道自己好弱智,这么简单的算法…就当是递归入门吧

    原文作者:数据结构之图
    原文地址: https://blog.csdn.net/u011339641/article/details/50537691
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞