[学习报告]《LeetCode零基础指南》(第九讲) 简单递归

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)遇到问题不要慌,分析问题,还原本质,探索规律,;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值