1 学习内容 简单递归
所谓递归,就是让函数不断地调用自己,这个过程需要消耗内存。
对于一个递归问题,关键在于厘清递归的关系以及递归退出的条件。
2 Leetcode 刷题
2.1 简单题型
相关题目
首先,在第1题中,要求计算阶乘后得到的结果n!有多少个0,实际上就是找n最多能够被多少个10整除。首先找递归关系,n!要被10整除,可以等价于被5*2整除,这里可不是废话,在阶乘中,2出现的次数一定比5多,比如10!中,2,4,6,8,10都含有2这个因子,而含有5的因子只有5,10。因此,问题转化为求n!能够被多少个5整除。但是,5*5=25中存在两个因子为5,同样,125中存在3个因子,所以,先要求n/5,再求25,再求125...,由此,推出递归关系。
f(n) = n / 5 + f(n/5);
而退出条件,由于4!= 24,5!=120,可以知道只有n>=5时,才存在阶乘后的0。
最终的源代码如下。
int trailingZeroes(int n){
if(n<5){
return 0;
}
return n/5 + trailingZeroes(n/5);
}
同样地,经过分析后,得到第2题的代码如下。
int numberOfSteps(int num){
if(num == 0){
return 0;
}
if (num % 2 == 1){
return 1+numberOfSteps(num-1);
}
else{
return 1+numberOfSteps(num/2);
}
}
2.2 二叉树问题
相关题目
二叉树问题需要先了解几个操作。
1、取root的值 root-> val;
2、取root的左节点 root -> left;
3、取root的右节点 root -> right;
第1题的源码如下
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
int countNodes(struct TreeNode* root){
if(root == NULL){
return 0;
}
return countNodes(root->left) + countNodes(root->right) + 1;
}
第2题的源码如下。
/**
* 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, sum = 0;
memset(Hash, 0, sizeof(Hash));
transfer(root);
for(i = 1; i<=1000; ++i){
if(Hash[i]) ++sum;
}
return sum;
}
2.3 拓展题目
相关题目 所有路径