C语言——递归函数之计算阶乘

发布于:2024-07-19 ⋅ 阅读:(36) ⋅ 点赞:(0)

1.介绍:

C语言中的递归函数是一种特殊的函数,它会调用自己来完成某项任务。递归函数通过把大问题分解为更小的相同类型的问题来解决,直到达到一个简单到可以直接解决的边界情况(称为基准情形或基本情况)。递归函数通常包含两个主要部分:

(1)基准情形(Base Case):递归必须有一个或多个基准情形,当到达这个基准情形时,函数不会再递归调用自身,而是返回一个值。基准情形是递归的出口,防止无限递归。

(2)递归步骤(Recursive Step):这是函数调用自己的部分,每次调用时,问题的规模都会减小,直到达到基准情形。

2.计算阶乘示例:

#include<stdio.h>
#include<stdlib.h>

int getFactor(int num)
{
	if(num > 12){
		puts("越界!");          //当数据值越界时,终止程序
		exit(-1);
	}
	int result;
	
	if(num == 1){
		result = 1;  //基准情形,当达到这个基准情形时函数不会再递归调用自身,而是返回一个值。目的是防止无限递归
	}else{
		result = getFactor(num - 1) * num;  //递归步骤,函数调用自己,同时问题规模减小直至到达基准情形
	}
	return result;
}


int main()
{
	int num;
	int numFactor;
	
	printf("请输入所求的阶乘数:\n");
	scanf("%d",&num);
	
	numFactor = getFactor(num);
	printf("%d的阶乘是:%d\n",num,numFactor);
	
	return 0;
}

输出将是:

请输入所求的阶乘数:
11
11的阶乘是:39916800

3.注意:

我们在程序中加入了一个判断模块,因为一个整型数据占4个字节,32位,能表示的最大数据为2的32次方:4,294,967,296 < 13! = 6,227,020,800。故我们设置当数据大于12的时候,终止程序。

当数据大于12时,输出将是:

请输入所求的阶乘数:
15
越界!
  • 递归函数虽然简洁,但如果不当使用(如没有明确的基准情形或递归步骤导致问题规模不减小),可能会导致栈溢出错误。
  • 对于某些问题,递归可能不是最高效的解决方案,特别是对于大量数据的处理,因为每次函数调用都会占用一定的栈空间,并且函数调用本身也有开销。在这些情况下,迭代(循环)可能是更好的选择。