·相信大家对阶乘其实并不陌生,这是一个数学常识:比如5的阶乘就可以写作:5!=5*4*3*2*1=120
在数学中,我们可以比较轻易的去求得一些数值较小的阶乘,因为计算量不大;但如果要去求得一个两位数甚至多位数的阶乘,那这个工程量实在是太大了(有时候连按计算机都嫌累!!!),好歹咱是学计算机的,这种没有营养的工作,编一段程序就嘎嘎解决了(^v^___)
接下来就由我给大家献丑了!
#include <stdio.h>
/*
递归函数:求阶乘
*/
int factorial(int n){ //factorial是阶乘的英文名哈,我也是百度的~
int plus=n; //为了方便解读,我们还是定义一个变量来存放乘积吧
//阶乘实质其实就是n*(n-1)*(n-2)*···*2*1
//所以在此处我可以先做一个判断,只要还没有数到1,我们就不断向下乘
while(n>=2){
plus=plus*(n-1); //这里就是老生常谈的n*(n-1)
n=n-1; //计算完以后别忘了改变循环变量
}
return plus;
}
int main(){
int n;
printf("请输入一个数,并求出它的阶乘:");
scanf("%d",&n);
printf("%d!=%d",n,factorial(n));
return 0;
}
这个是一个比较经典的用循环函数去求阶乘,在这里其实可以延伸出一个概念:那就是递归啦
递归是个好东西(从前有座山,山上有座庙,庙里有个老和尚在讲故事,讲的是从前……)
但是很多人容易把递归给搞混(包括本人),也许有人会想,能用while循环为什么还要用递归函数?闲的?
那在这里我就给大家讲清楚这两者的区别:(我也是copy的)
- 实现方式不同。递归函数是通过函数自身调用自身来实现的,它通常用于处理具有层次结构的任务,如遍历树状数据或执行菜单操作;循环函数则通过迭代来实现,它包括for、while、do-while等语句,用于重复执行某些代码直到满足特定条件。13456789
- 内存消耗不同。递归函数在运行时可能会占用更多的内存,尤其是在处理大型数据结构或进行深度递归时,可能导致堆栈溢出;循环函数通常不需要函数调用,因此在内存使用上更为高效。149
- 代码的可读性和简洁性不同。递归函数通常具有更高的代码简洁性和易于理解的特点,但有时难以跟踪函数的调用层次;循环函数则相对简单明了,易于阅读和维护。123
- 适用场景不同。递归函数适合处理具有明确递归终止条件的问题,如数据结构操作、算法实现等;循环函数则适用于需要重复执行某些操作直到满足条件的情况,如数值计算、列表遍历等。
在这里我给大家准备了一个非常经典的递归问题:(大家一起探讨,请大家斧正!!!)
在这里我也给大家准备好了完整的程序,请各位看管批判!