第九天《递归》

文章目录

今日知识总结

  1. 递归:函数自己调用自己

    1. 实现一个函数,函数会自己调用自己,每次调用传参不同
    2. 一定要有递归出口,满足什么条件后return,不然就会死递归,造成栈溢出的问题
    3. 根据递推式补充递归调用内容
  2. 递归调用阶乘

    1. 阶乘定义: n ! = n ∗ ( n − 1 ) ∗ ( n − 2 ) ∗ ( n − 3 ) . . . ∗ 3 ∗ 2 ∗ 1 n! = n * (n - 1) * (n - 2) *(n -3)...*3 * 2 * 1 n!=n(n1)(n2)(n3)...321

    2. 转换成递归式: n ! = n ∗ ( n − 1 ) ! n! = n * (n - 1)! n!=n(n1)!

    3. f n ( n ) = n ! fn(n) = n! fn(n)=n!,则有 f n ( n ) = n f ( n − 1 ) fn(n) = nf(n - 1) fn(n)=nf(n1)

    4. 代码:

      int jiecheng(int n ){
          if(n <= 1) return 1;
          return n * jiecheng(n - 1);
      }
      
    5. 递归的两个过程:递推和回溯

题目分析

  1. 172. 阶乘后的零

    1. 题目链接:https://leetcode-cn.com/problems/factorial-trailing-zeroes/

    2. 思路:当n < 5的时候,n!中没有10的因子,尾部是没有零的,于是我们发现,问题本质就是在求10的因子数,而2的因子不会少于5,所以这道题其实是在求5的因子量

    3. 代码:

      class Solution {
      
      public:
          int trailingZeroes(int n) {
              if(n < 5) return 0;
              return  n / 5 + trailingZeroes(n / 5);
      
          }
      };
      
  2. 1342. 将数字变成 0 的操作次数

    1. 题目链接:https://leetcode-cn.com/problems/number-of-steps-to-reduce-a-number-to-zero/

    2. 思路:

      • 根据题意模拟,递归出口,n == 0;
      • n为偶数,就是从n / 2的状态来的
      • n为奇数,就是从n - 1的状态来的
    3. 代码:

      class Solution {
      public:
          int numberOfSteps(int num) {
              if(num == 0) return 0;
              if(num % 2 == 0) return 1 + numberOfSteps(num / 2);
              else return 1 + numberOfSteps(num - 1);
      
          }
      };
      
  3. 222. 完全二叉树的节点个数

    1. 题目链接:https://leetcode-cn.com/problems/count-complete-tree-nodes/

    2. 思路:空树return0,非空树的节点数为左子树节点个数 + 右子树节点个数 + 1

    3. 代码:

      /**
       * Definition for a binary tree node.
       * 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:
          int countNodes(TreeNode* root) {
              if(root == null) return 0;
              return countNodes(root -> left) + countNodes(root -> right) + 1;
      
          }
      };
      
  4. LCP 44. 开幕式焰火

    1. 题目链接:https://leetcode-cn.com/problems/sZ59z6/

    2. 思路:

      • 将二叉树的当前节点标记
      • 递归遍历左子树
      • 递归遍历右子树
    3. 代码:

      /**
       * Definition for a binary tree node.
       * struct TreeNode {
       *     int val;
       *     struct TreeNode *left;
       *     struct TreeNode *right;
       * };
       */
      
      int Hash[1024];
      void transfer(struct TreeNode* root){
          if(root){
              Hash[root -> val] = 1;
              transfer(root -> left);
              transfer(root -> right);
          }
      }
      int numColor(struct TreeNode* root){
          int i = 0, sum = 0;
          memset(Hash, 0, sizeof(Hash));
          transfer(root);
          for(int i = 1; i <= 1000; ++i){
              if(Hash[i]) ++sum;
          }
          return sum;
      
      }
      

今日收获:

  1. 二叉树的前序遍历
  2. 递归表达式的由来

今日疑问:

1.树相关知识:后续会专门写一篇博客来记录关于二叉树的学习

资料链接

博客链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值