0. 知识概念
思考问题,发现递推规律后实现递归:
递归的4步骤:
(1)写一个递归函数名f(){};
(2)递归的终止靠递归转折点:一般是一个if 语句控制;
(3)递归的出口:返回值ret;
(4)递归的递推通项:调用递归函数本身,ret = 含f(n-1)或f(n+5)或f(n/5)或n->left,root->right等项
1. 解题报告
Q0:172. 阶乘后的零
/*思路:分析问题找规律;
分析问题,还原问题:求0的个数转化为求n的阶乘的因子有多少个5
找规律:从1开始到n,每5个数有一个因子5,ans = n/5;
从1开始到n,每25个数再叠加一个因子5,ans += ans/25;
从1开始到n, 每125个数,再叠加一个因子5;ans += ans/125;
从1开始到n,每625个数u,再叠加一个因子5; ans += ans/625;
...;
ans = n/5 + n/25 + n/125 + n/625 + ...;
递推通项:f(n) = n/5 + f(n/5),直到n < 5;;
*/
int trailingZeroes(int n){
if(n < 5) {
return 0;/* (1)if语句控制的转折点,此时返回return 只是结束递归运算*/
}
return n / 5 + trailingZeroes(n/5); /*(2)递归通项和返回值ret = n/5 + f(n/5);*/
}
Q2:1342. 将数字变成 0 的操作次数
int numberOfSteps(int num){
int ret = 0;
if(num == 0)
ret = 0;
else if(num%2 ==0)/*此处num不为0*/
ret = numberOfSteps(num/2)+1;
else
ret = numberOfSteps(num - 1)+1;
return ret;
}
Q3:222. 完全二叉树的节点个数
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
/*(1)空树的节点个数为0
(2)非空树的节点个数=左子树个数+右子树个数+1*/
int countNodes(struct TreeNode* root){
if(root == NULL)/* debug:将“==”写成"="*/
{
return 0;
}
return countNodes(root->left) + countNodes(root->right) + 1;
}
Q4: LCP 44. 开幕式焰火
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
int Hash[1024];/*为什么是1024而不是,1001*/
void transfer(struct TreeNode* root){
if(root)
{
Hash[root->val] = 1;
transfer(root->left);
transfer(root->right);
}
}
int numColor(struct TreeNode* root){
int sum=0,i;
memset(Hash,0,sizeof(Hash));/*1024?
*/
transfer(root);
for(i=1;i<=1000;++i)
{
if(Hash[i])
{
sum += Hash[i];
}
}
return sum;
}
3. 思考归纳
(1) 二叉树和递归有缘;
(2)遇到问题不要慌,分析问题,还原本质,探索规律,;