九日集训 Day 9 简单递归

1 学习内容 简单递归

所谓递归,就是让函数不断地调用自己,这个过程需要消耗内存。

对于一个递归问题,关键在于厘清递归的关系以及递归退出的条件。

2 Leetcode 刷题

2.1 简单题型

相关题目

阶乘后的零

将数字变成 0 的操作次数

首先,在第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 拓展题目

相关题目 所有路径

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值