具有返回值的递归

Posted yuelien

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了具有返回值的递归相关的知识,希望对你有一定的参考价值。

  一个函数只能有一个返回值,具有返回值的递归函数若平行的多次调用自身,那么将会产生多个返回值,这是一个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,递归是以一条路走到黑,走不动再返回分岔口再选择另一条路,最终遍历多分枝的所有路径的方法,类似我们走迷宫的暴力解法。每条路径不能直接进行传值等交互操作但是,但我们可以对路径进行选择,选择符合我们条件的路径的结果。

以上是关于具有返回值的递归的主要内容,如果未能解决你的问题,请参考以下文章

具有获取 json 值的片段中的自定义适配器

返回具有给定短语(数组)值的键

从使用 wkwebview 返回值的 javascript 调用 swift 函数

为啥不调用具有 const 引用返回值的重载方法?

为具有 C++ 字符串返回值的函数返回本地 C 字符串

TSQL 错误:不能在此上下文中使用具有返回值的 RETURN 语句