Day 9 二级指针
递归概念定义
递归含义
就是函数反复调用自己。实现函数,函数会调用自身
满足条件后一定要return,否则会无限循环
递归函数实现
// 实现函数,作为阶乘的递推式
// 实现步骤 1
// 建立函数名称,确定参数类型和返回值类型,如下
int JieCheng(int n){
}
// 实现步骤 2
// 优先设立递归出口
// 当 n=0或者1时,n! 为1,所以结束循环
int JieCheng(int n){
if (n <= 1){
return 1;
}
}
// 实现步骤 3
// 建立递归规则
int JieCheng(int n){
if (n <= 1){
return 1;
}
return n * JieCheng(n-1);
}
题目练习
LC 172 阶乘后的零
给定一个整数n, 返回n!中尾随零的数量。
例1:
输入 n = 5 输出 1
原因 5! = 120 有1个尾随0
先考虑什么状况尾数会为0,并且会有几个
- 当n<5时,1 2 3 4的阶乘是不会出现以0为结尾的数字,所以第一条设定 n < 5时return 0
int trailingZeroes(int n){
if(n<5){
return 0;
}
- 当一个数字尾数有0时,代表这个数会被 2 x 5 = 10 提供一个 0 (4x5,6x5,8x5都会有因子2x5)所以问题会被先转化成2 和 5的数量
- 如何在步骤2上更简洁一步?考虑2和5的数量关系,当n = 5时,2的数量 > 5的数量,所以直接求5的个数,2的因子个数永远会比5大
- 根据5的个数,可以得知在阶乘中会出现的状况有:5, 5x5 , 5x5x5, 5x5x5x5…
- 根据4设立递归思想,求5因子数量
- 逆推后可以有如下式子,套用递归进行求解。
LC 1342 将数字变为0的操作次数
提供一个非负整数num,返回将其变为0的步数。
若为偶,除以2
若为奇,减去1
如题 递归思路为再次调用结果进行奇/偶判断
int numberOfSteps(int num){
if(num==0){
return 0; // 跳出条件
}
if (num%2 != 1){
return numberOfSteps(num/2)+1; // 如果是偶数,num除以2后次数+1
}
else{
return numberOfSteps(num-1)+1; //如果是奇数,num减去1后次数+1
}
}
LC 222 完全二叉树的节点个数
我去 树我完全不懂啊!
只能班门弄斧了
给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。
完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。
int countNodes(struct TreeNode* root){
if(root == NULL) {
return 0;
}
return countNodes(root->left) + countNodes(root->right) + 1;
}
- 跳出条件 当root数量为0时跳出
- 递归方式 左子树个数+右子树个数+1
LCP 44 开幕式烟火
完蛋了哈希表也不会。。。菜哭了