社区万人千题[入门]九日集训帖子详情《LeetCode零基础指南》(第九讲) 简单递归

简单递归

定义

递归就是函数自我调用

递归需要注意的三点:

  • 你要实现一个函数, 这个函数会调用自己, 并且每次调用, 函数传参

  • 递归一定要有出口, 即满足一定条件后需要return, 否则就可能出现死递归(引起栈溢出);

  • 根据递推式来补充你的递归调用内容;

操作

递归调用阶乘

我们知道, 阶乘即

n! = n * (n - 1) * \cdot * 3 * 2 * 1

光知道这个, 我们是无法将它进行递归计算的, 我们需要将它转换成递推式, 如下:


n! = n * (n - 1)!

这时候, 我们令f(n) = n!, 则有:


f(n) = nf(n -1)
 

这就是阶乘的递推式

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);
}

为什么叫递归

img

课后习题

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值