一个函数只能有一个返回值,具有返回值的递归函数若平行的多次调用自身,那么将会产生多个返回值,这是一个bug。所以在具有树形多分枝结构的递归中,一般使用void作为返回值类型,形参在每条路径中作为值传递,在出口处对这些值进行保存或比较输出。例如求树高 的两种写法:
1 struct Node{ 2 int val; 3 Node* child; 4 Node* sibling; 5 Node(){ 6 child=NULL; 7 sibling=NULL; 8 } 9 }; 10 int height(Node *root){ 11 if(root){ 12 int maxh=0; 13 for(Node *p=root;p;p=p->sibling){ 14 int tmp=height(p->child); 15 if(maxh<tmp){ 16 maxh=tmp; 17 } 18 } 19 return maxh+1; 20 } 21 return 0; 22 }
1 int maxh=0; 2 void height(Node *root,int h){ 3 if(root){ 4 for(Node* p=root;p;p=p->sibling){ 5 height(p->child,h+1); 6 } 7 }else{ 8 if(maxh<h){ 9 maxh=h; 10 } 11 } 12 }
这是因为树高要求每条路径的最深,再进行比较,是到最深处才能确定的。也是唯一的解。而其除了这些有唯一解的递归问题,比如n皇后问题所代表的一类多解问题,或者是多分枝层次问题,例如递归建立二叉树,就很难使用带有返回值的递归求解。带有返回值的递归,由浅入深,在最深处达到出口进行计算后能逐层返回浅层。
一个关键性的点,就是具象的多分枝递归是一个怎样的过程,前面的文章中提到过多分枝的递归问题生成树形结构。故具体的可以参考二叉树的三种递归遍历和图论中的DFS,递归是以一条路走到黑,走不动再返回分岔口再选择另一条路,最终遍历多分枝的所有路径的方法,类似我们走迷宫的暴力解法。每条路径不能直接进行传值等交互操作但是,但我们可以对路径进行选择,选择符合我们条件的路径的结果。
原文地址:https://www.cnblogs.com/yuelien/p/9855712.html
时间: 2024-10-02 12:06:28