具有返回值的递归

一个函数只能有一个返回值,具有返回值的递归函数若平行的多次调用自身,那么将会产生多个返回值,这是一个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

具有返回值的递归的相关文章

javascript函数(声明,传参,返回值,递归)

javascript函数(声明,传参,返回值,递归) 1.函数的基本概念 函数:是由事件驱动的或者当他被调用时可执行的可重复使用的代码块. 空调是由遥控器控制或者当开关打开时,可运行的家用电器(工具) 特点: 封装代码----使代码更简洁 重复使用---在重复功能的时候直接调用就好 执行时机---随时可以在我们想要执行的时候执行 2.函数的创建和执行 1. 函数的创建 1.声明式 函数声明的关键字 : ==function== function 关键字 和 var 关键字的行为几乎一致,都会在内

python 复习 4-1 函数、参数、返回值、递归

函数 完成特定功能的一个语句组,这个语句组可以作为一个单位使用,并且给它组语句取一个名子,即函数名 可以通过函数名在程序不同地方多次执行,即函数调用 预定义函数(可以直接使用) 自定义函数(自编写的) 函数的定义: def 函数句([参数列表]): //定义 ``` def hello (): print(hello world) #### 函数的调用: - 函数名([参数列表]) //调用 hello() #### 函数的参数: 形式参数和实际参数 - 在定义函数时,函数名后面的括号中的变量名

python 递归调用 返回值问题

当使用递归时并有返回值时,调用自身函数时需要加上return语句如下: def daxiao(biao1,biao2): #判断两个列表的大小,根据里面的元素大小 #如果biao1大于biao2,返回1, #如果biao1小于biao2,返回0 #如果两者相等,返回3 geshu1=len(biao1) geshu2=len(biao2) b1=int(biao1[0]) b2=int(biao2[0])  #这里只能比较数值大小,不能通过字符串直接比较大小 print(biao1) print

返回值递归问题

遇到此问题的时候,如果运行递归要返回值的话,一般可以这样写 return 后面接递归的函数. 题目一:数字在排序数组中出现的次数 class Solution { public: int GetNumberOfK(vector<int> data ,int k) { int number=0; if(data.size()!=0){ int first=GetFirstk(data,k,0,data.size()-1); int last=GetLastk(data,k,0,data.size

第10天:apply和call、bind、函数作为参数、返回值使用、闭包、递归的样例

apply和call apply和call都可以改变this的指向 函数的调用,改变this的指向 函数名字.apply(对象,[参数1,参数2,.....]) 方法名字.apply(对象,[参数1,参数2,.....]) 方法名字.call(对象,参数1,参数2,.....) 方法名字.call(对象,参数1,参数2,.....) 不同的地方:参数传递是方式不一样 只要是想使用别的对象的方法,并且希望这个方法是当前对象的,那么久可以使用apply或者call的方法改变this的指向 apply

尾递归 递归函数中,递归调用是整个函数体中最后的语句,且它的返回值不属于表达式的一部分时,这个递归调用就是尾递归,空间复杂度是O(1)

什么是递归深度 递归深度就是递归函数在内存中,同时存在的最大次数. 例如下面这段求阶乘的代码: Java: int factorial(int n) { if (n == 1) { return 1; } return factorial(n - 1) * n; } Python: def factorial(n): if n == 1: return 1 return factorial(n-1) * n C++: int factorial(int n) { if (n == 1) { re

循环递归+返回值(TreeView示例)

示例:获取TreeView的所有Node,保存到List<TreeNode>,封装到通用工具类: 方法一:使用static方法.属性---调用前清空static类型的List 1 public static List<TreeNode> allNodes = null; 2 public static void GetTreeViewAllNodes(TreeNodeCollection Nodes) 3 { 4 foreach (TreeNode node in Nodes) 5

GetLastError()函数返回值及含义

GetLastError返回的值通过在api函数中调用SetLastError或SetLastErrorEx设置.函数并无必要设置上一次错误信息,所以即使一次GetLastError调用返回的是零值,也不能担保函数已成功执行.只有在函数调用返回一个错误结果时,这个函数指出的错误结果才是有效的.通常,只有在函数返回一个错误结果,而且已知函数会设置GetLastError变量的前提下,才应访问GetLastError:这时能保证获得有效的结果.(来源:百度百科) 在进行windows网络编程时,可以

帮助大家理解一下递归函数的返回值...

如题: 递归函数往往可以简化我们的代码,尤其是对树的遍历和利用回溯算法写代码的时候,但是递归函数的返回值往往是困扰我们的. 总体来说,我们先要理解函数的调用过程,函数调用过程会用栈来保存函数的返回值和过程,而递归函数就是调用自身函数的过程,所以也是用栈存储,这样就比较容易理解了. 下面一段代码可以帮助大家理解递归函数的返回值. 1 package test; 2 3 4 public class RecursionValueReturn { 5 6 /* 7 *目的: 8 * 递归返回值测试 9