简单递归
定义
递归就是函数自我调用
递归需要注意的三点:
-
你要实现一个函数, 这个函数会调用自己, 并且每次调用, 函数传参
-
递归一定要有出口, 即满足一定条件后需要
return
, 否则就可能出现死递归(引起栈溢出); -
根据递推式来补充你的递归调用内容;
操作
递归调用阶乘
我们知道, 阶乘即
光知道这个, 我们是无法将它进行递归计算的, 我们需要将它转换成递推式, 如下:
这时候, 我们令f(n) = n!, 则有:
这就是阶乘的递推式
1 实现一个函数
这个函数叫JieCheng
, 它的参数是一个整数, 返回值也是一个整数, 实现如下:
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);
}
为什么叫递归
课后习题
1. 阶乘尾后零
int trailinZeroes(int n) {
if(n < 5) {
return 0;
}
return n / 5 + trailingZeros(n / 5)
}
2. 将数字变成 0 的操作次数
int numberOfSteps(int num) {
if(num == 0) {
return 0;
}
if(num % 2 == 1) {
return numberOfSteps(num - 1) + 1;
} else {
return numberOfSteps(num/2) + 1;
}
}
3. 完全二叉树的节点个数
int countNodes(struct TreeNode* root) {
of(root == NULL) {
return 0;
}
return countNOdes(root -> left) + countNodes(root ->right) + 1;
}
4. 开幕式
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));
transser(root);
for(i = 1; i <= 1000; ++i) {
if(Hash[i])
++sum;
}
return sum;
}