Linux C 编程教程第 18 部分:递归函数Linux C 编程教程第 18 部分:递归函数Linux C 编程教程第 18 部分:递归函数Linux C 编程教程第 18 部分:递归函数
  • 文章
  • 正则表达式
    • 工具
  • 登录
找到的结果: {phrase} (显示: {results_count} 共: {results_count_total})
显示: {results_count} 共: {results_count_total}

加载更多搜索结果...

搜索范围
模糊匹配
搜索标题
搜索内容
发表 admin at 2025年2月28日
类别
  • 未分类
标签

Linux C 编程教程第 18 部分:递归函数

在此页

  1. 结论

无论您使用哪种编程语言,随着您开始越来越多地编写代码,您将学习使您的代码清晰易读/理解的概念。 C 中也有几个这样的概念。其中之一是递归函数,本文将对此进行讨论。

递归函数是一个调用自身的函数。调用可以直接从函数体内进行,也可以间接从被相关函数调用的其他函数中进行。

下面是一个直接递归的例子:

int func (int a)
{
//statements

func(a-1);

// statements

return 0;
}

这是一个间接递归的例子:

int func (int a)
{
//statements

func_new(a);

// statements

return 0;
}

int func_new(int b)
{
//statements

func(b-1);

//statementsur

return 0;
}

正如一开始已经提到的,递归可以帮助您获得紧凑的代码,这样的代码不仅易于编写,而且易于理解和审查。让我们举个例子来更清楚地说明这个优势。

相信大家都听说过阶乘的概念。对于那些不知道的人,阶乘是将一个整数与所有小于它的正整数相乘得到的结果。例如,5 的阶乘为 5x4x3x2x1,等于 120。

这是一个简单的代码来找到一个数字的阶乘:

#include <stdio.h>

int main()
{
int a = 0, i = 0, fact = 1;
printf("Enter a number: ");

scanf("%d", &a);

for(i=1; i<=a; i++)
{
fact = fact * i;

}
printf("Factorial of the number is: %d ", fact);
return 0;
}

请注意,此代码只是让您了解如何通过 C 程序计算数字的阶乘。该程序不会处理可能影响其生成结果准确性的极端情况。

因此,这是无需使用递归函数即可计算数字阶乘的众多方法之一。现在让我们看一段使用递归计算阶乘的代码。

#include <stdio.h>

int factorial (int b)
{
if(!b)
return 1;

return (b * factorial(b-1));
}

int main()
{
int a = 0, fact = 1;
printf("Enter a number: ");

scanf("%d", &a);

fact = factorial(a);

printf("Factorial of the number is: %d ", fact);
return 0;
}

所以你可以看到,实际计算阶乘的函数阶乘非常紧凑。如果您密切注意,它也很容易理解。

对于那些不知道发生了什么的人,用户输入的值,比如 5,在第一次从主函数中调用时传递给阶乘函数。在阶乘函数内部,检查输入值是否为零,当第一次使用输入值 5 调用该函数时,情况并非如此。

然后,return 语句包含一个将 5 乘以 factorial(4) 的返回值的表达式。所以现在,阶乘函数再次执行,我们得到以下表达式:return (4 * factorial(3))。然后再次重复这些步骤。

因此,如果您从广义上看,这些函数调用是如何堆叠的:

  • 5 * 阶乘(4)
  • 4 * 阶乘(3)
  • 3 * 阶乘(2)
  • 2 * 阶乘 (1)
  • 1 * 阶乘 (0)

现在当 factorial(0) 执行时,factorial 函数中的 if 条件变为真,并返回值 1。所以现在,上面列出的调用是这样完成的(比较上一个列表中的最后一个条目与这个列表中的第一个条目,依此类推):

  • 1 * 1
  • 2 * (1*1)
  • 3 * (2*(1*1))
  • 4 * (3*(2*(1*1)))
  • 5 * (4 * (3*(2*(1*1))))

这实际上是 5 * 4 *3 * 2 * 1,它又是 120,即 5 的阶乘。

这就是递归函数的工作原理。虽然到目前为止我们列出的递归函数优点是毋庸置疑的,但也有一些缺点。

例如,在我们上面的例子中,直到 factorial(0) 调用完成,所有之前的 factorial 调用都在等待函数处理完成。更不用说自动变量或局部变量为每次递归调用占用内存这一事实。

因此,当您使用递归时,实际上并没有节省存储空间。另外,也不能保证您的代码执行速度会更快。递归函数的真正优势在于处理数据结构时,这将在稍后作为正在进行的 C 教程系列的一部分进行讨论。

结论

总而言之,虽然您可能不会在日常编码任务中经常使用递归函数,但它是您必须了解的一个重要概念。尝试我们在此处提到的示例,并对其进行调整以更好地理解递归函数的概念。

©2015-2025 艾丽卡 support@alaica.com