函数递归或循环 求阶乘

递归:c允许函数调用它自己,这种调用过程称为递归。可以使用循环的地方通常都可以使用递归,有时用循环解决问题比较好,但有时用递归更好。递归方案更简洁,但效率却没有循环高。

阶乘:一个正整数的阶乘是从1到该整数的所有整数的乘积。例如,3 的阶乘是1*2*3,0 阶乘等于1,负数没有阶乘。

#include<stdio.h>
int xunhuan(int);           //循环
int DiGui(int);             //递归
int main()
{
	printf("请输入一个非负整数:");	

	int number=0;
	scanf("%d",&number); 
    printf("\n");


	printf("%d的阶乘是(循环):%d\n",number,xunhuan(number));
	
	printf("%d的阶乘是(递归):%d\n",number,DiGui(number));	

	return 0;
}
int xunhuan(int number)
{
	int i=1;
	int factorial=1;

	while(i <= number && number > 1){
		factorial*=i;
		i++;
	}
	
	return factorial;
}

int DiGui(int factorial)
{
	
	if(factorial > 1){
	factorial*=DiGui(factorial - 1);	
	}

	return factorial;
}

编译一下:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP6IKW55Sz5YWL55qE5pWR6LWO,size_20,color_FFFFFF,t_70,g_se,x_16

循环很好理解,说一下递归,假设我们算一下 4 的阶乘:

变量                  factorial = factorial  * DiGui( factorial - 1 )

第一级调用后       4         =      4       *         // main函数调用DiGui的时候就算第一级调用

第二级调用后        3        =      3       *       2  

第三级调用后             =      2       *       1  

第四级调用后        1  不满足 if 条件,然后会逐级返回递归

第四级返回后        2        =      2        *      1        ==2

第三级返回后        3        =      3        *      2        ==6

第二级返回后        4        =      4        *      6        ==24

第一级返回就是给 main 函数了

懂了吧

然后补充几个书上认为的要点:

  1. 每次函数调用都会返回一次。当函数执行完毕后,控制权将被传回上一级。程序必须按顺序逐级放回,从某级 DiGui()返回上一级的 DiGui(),不能跳级回到 main()中的第一级调用。
  2. 递归函数中位于递归调用之前的语句,均按被调函数的顺序执行。
  3. 递归函数中位于递归调用之后的语句,均按被调函数相反的顺序执行。
  4. 虽然每级递归都有自己的变量,但是并没有拷贝函数的代码。程序按顺序执行函数中的代码,而递归调用就相当于又从头开始执行函数的代码。除了为每次递归调用创建变量外,递归调用非常类似于一个循环语句。实际上,递归有时可用循环来代替,循环也有时能用递归来代替。
  5. 递归函数必须包含能让递归停用的语句(就是 while 、for 、do-while 那样的循环结束条件)。

  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值