函数的递归

一.C语言函数递归的定义

在C语言中,函数的递归调用意味着一个函数在其定义中直接或间接地调用自身。递归函数通常用于解决可以分解为更小、相似子问题的问题。递归函数有两个基本部分:


1. 递归终止条件:

当函数满足某个条件时,它将不再递归调用自身,而是直接返回一个值。这个条件通常是基于函数参数的一个简单测试。


2. 递归步骤:

在递归终止条件不满足时,函数将执行一些操作,并(直接或间接地)调用自身来处理更小或更简单的子问题。
 

二.举例说明 

1.计算输入值的阶乘

 完整代码:

#include <stdio.h>

// 计算阶乘的递归函数
int factorial(int n) {
    if (n == 0) { // 递归终止条件
        return 1;
    }
    else {
        return n * factorial(n - 1); // 递归调用
    }
}

int main() {
    int n = 0;
    printf("请输入一个整数:");
    scanf("%d", &n);
    int sum = factorial(n);
    printf("%d! = %d\n", n, sum);
    return 0;
}

 运行实例:

这是一个计算输入整数阶乘的程序,通过递归调用factorial函数实现计算,例如,当我们输入5时

`factorial` 函数能够返回 5 的阶乘是因为它使用了递归调用的机制。递归调用允许函数在其义内部调用自身,每次调用时都会将问题规模减小,直到达到一个基准情况(也称为递归终止条件)。

在 `factorial` 函数的例子中,递归终止条件是 `n == 0`。当 `n` 为 0 时,函数返回 1,这是阶乘的基准情况(因为 0 的阶乘定义为 1)。

对于 `n` 大于 0 的情况,函数会返回 `n` 乘以 `factorial(n - 1)` 的结果。这就是递归调用的部分,它将问题规模减小了 1。

现在,让我们逐步分析 `factorial(5)` 的调用过程:

1. 调用 `factorial(5)`。
2. 因为 `5 != 0`,所以执行 `return 5 * factorial(4);`。
3. 为了计算 `factorial(4)`,再次调用 `factorial` 函数。
4. 因为 `4 != 0`,所以执行 `return 4 * factorial(3);`。
5. 为了计算 `factorial(3)`,再次调用 `factorial` 函数。
6. 因为 `3 != 0`,所以执行 `return 3 * factorial(2);`。
7. 为了计算 `factorial(2)`,再次调用 `factorial` 函数。
8. 因为 `2 != 0`,所以执行 `return 2 * factorial(1);`。
9. 为了计算 `factorial(1)`,再次调用 `factorial` 函数。
10. 因为 `1 != 0`,所以执行 `return 1 * factorial(0);`。
11. 现在调用 `factorial(0)`,达到了递归终止条件,返回 1。
12. `factorial(1)` 收到 `factorial(0)` 返回的 1,计算 `1 * 1` 并返回 1。
13. `factorial(2)` 收到 `factorial(1)` 返回的 1,计算 `2 * 1` 并返回 2。
14. `factorial(3)` 收到 `factorial(2)` 返回的 2,计算 `3 * 2` 并返回 6。
15. `factorial(4)` 收到 `factorial(3)` 返回的 6,计算 `4 * 6` 并返回 24。
16. `factorial(5)` 收到 `factorial(4)` 返回的 24,计算 `5 * 24` 并返回 120。

类似于该图:



最终,`factorial(5)` 返回了 120,即 5 的阶乘。

 三.注意事项

请注意,递归函数必须有一个或多个递归终止条件,否则它们将无限期地调用自身,导致栈溢出错误。此外,递归函数通常比非递归函数消耗更多的内存和计算时间,因为它们需要在每次调用时保存额外的信息(如局部变量和返回地址)在调用栈上。因此,在可以使用迭代算法的情况下,通常首选迭代算法。然而,递归在某些情况下(如树遍历或分治算法)可能更为直观和易于实现。
 

  • 29
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值