• C++递归函数


    递归函数

    编写递归函数步骤:

    1 明确你这个函数想要干什么,函数功能是什么,要完成什么样的一件事

    2 寻找递归结束条件,所谓递归,就是会在函数内部代码中,调用这个函数本身,
    所以,我们必须要找出递归的结束条件,不然的话,会一直调用自己,进入无底洞。
    也就是说,我们需要找出当参数为啥时,递归结束,之后直接把结果返回,请注意,
    这个时候我们必须能根据这个参数的值,能够直接知道函数的结果是什么。

    3 所谓递归,就是会在函数内部代码中,调用这个函数本身,所以,
    我们必须要找出递归的结束条件,不然的话,会一直调用自己,
    进入无底洞。也就是说,我们需要找出当参数为啥时,递归结束,之后直接把结果返回,
    请注意,这个时候我们必须能根据这个参数的值,能够直接知道函数的结果是什么。

    关于递归结束条件是否够严谨问题,有很多人在使用递归的时候,由于结束条件不够严谨,
    导致出现死循环。也就是说,当我们在第二步找出了一个递归结束条件的时候,
    可以把结束条件写进代码,然后进行第三步,但是请注意,当我们第三步找出等价函数之后,
    还得再返回去第二步,根据第三步函数的调用关系,会不会出现一些漏掉的结束条件。
    就像上面,f(n-2)这个函数的调用,有可能出现 f(0) 的情况,导致死循环,所以我们把它补上

    4 考虑优化,是否有重复计算
    如何优化?一般我们可以把我们计算的结果保证起来
    可以用数组或者 HashMap 保存,我们用数组来保存把,把 n 作为我们的数组下标,f(n) 作为值,
    例如 arr[n] = f(n)。f(n) 还没有计算过的时候,我们让 arr[n] 等于一个特殊值,例如 arr[n] = -1。
    当我们要判断的时候,如果 arr[n] = -1,则证明 f(n) 没有计算过,否则, f(n) 就已经计算过了,且 f(n) = arr[n]。
    直接把值取出来就行了

    参考资料:
    https://www.zhihu.com/search?type=content&q=递归函数

    /*给定一个二叉树,找出其最大深度。
    
    二叉树的深度为根节点到最远叶子节点的最长路径上的节点数*/
    
    #include <stdio.h>
    #include <windows.h>
    #include<algorithm>
    
      struct TreeNode {
          int val;
          TreeNode *left;
          TreeNode *right;
          TreeNode() : val(0), left(nullptr), right(nullptr) {}
          TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
          TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
      };
    
    
    class Solution {
    public:
    	//1 明确函数功能,计算二叉树的最大深度
    	int maxDepth(TreeNode* root) {
    		//2 寻找递归结束条件
    		if (!root)
    		{
    			return 0;
    		}
    		int leftheight = maxDepth(root->left);
    		int rightheight = maxDepth(root->right);
    
    		//3 最大深度 = max{左子树深度,右子树深度}+1
    		//max函数在windows.h中定义
    		return max(leftheight, rightheight)+1;
    	
    		//4 递归优化,每个节点只计算了一次,不用进行优化
    	}
    
    };
    
    
  • 相关阅读:
    apktool 在mac下的使用 -反编译安卓apk文件
    通过Stetho在Chrome上调试Android App
    Android Studio 遇到 No Debuggable Applications 的解决方案
    安装Eclipse Maven插件的方法
    Android如何实现点击一次返回键返回桌面而不是退出应用
    安卓7.0遇到 android.os.FileUriExposedException: file:///storage/emulated.. exposed beyond app through Intent.getData()
    由Memcached使用不当而引发性能问题的两个经验总结
    对MySql查询缓存及SQL Server过程缓存的理解及总结
    由Java中toString()方法引发的无意识的递归想到的
    为什么不能把委托(delegate)放在一个接口(interface)当中?
  • 原文地址:https://www.cnblogs.com/LuckCoder/p/14380006.html
Copyright © 2020-2023  润新知