文章目录
今日知识总结
-
递归:函数自己调用自己
- 实现一个函数,函数会自己调用自己,每次调用传参不同
- 一定要有递归出口,满足什么条件后return,不然就会死递归,造成栈溢出的问题
- 根据递推式补充递归调用内容
-
递归调用阶乘
-
阶乘定义: n ! = n ∗ ( n − 1 ) ∗ ( n − 2 ) ∗ ( n − 3 ) . . . ∗ 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 ∗ ( n − 1 ) ! n! = n * (n - 1)! n!=n∗(n−1)!
-
令 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(n−1)
-
代码:
int jiecheng(int n ){ if(n <= 1) return 1; return n * jiecheng(n - 1); }
-
递归的两个过程:递推和回溯
-
题目分析
-
-
题目链接:https://leetcode-cn.com/problems/factorial-trailing-zeroes/
-
思路:当n < 5的时候,n!中没有10的因子,尾部是没有零的,于是我们发现,问题本质就是在求10的因子数,而2的因子不会少于5,所以这道题其实是在求5的因子量
-
代码:
class Solution { public: int trailingZeroes(int n) { if(n < 5) return 0; return n / 5 + trailingZeroes(n / 5); } };
-
-
-
题目链接:https://leetcode-cn.com/problems/number-of-steps-to-reduce-a-number-to-zero/
-
思路:
- 根据题意模拟,递归出口,n == 0;
- n为偶数,就是从n / 2的状态来的
- n为奇数,就是从n - 1的状态来的
-
代码:
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); } };
-
-
-
题目链接:https://leetcode-cn.com/problems/count-complete-tree-nodes/
-
思路:空树return0,非空树的节点数为左子树节点个数 + 右子树节点个数 + 1
-
代码:
/** * 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; } };
-
-
-
题目链接:https://leetcode-cn.com/problems/sZ59z6/
-
思路:
- 将二叉树的当前节点标记
- 递归遍历左子树
- 递归遍历右子树
-
代码:
/** * 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.树相关知识:后续会专门写一篇博客来记录关于二叉树的学习