递归和非递归分别实现求n的阶乘(不考虑溢出的问题)

一、阶乘的定义

先讲一下阶层的定义:

阶乘是基斯顿·卡曼(Christian Kramp,1760~1826)于 1808 年发明的运算符号,是数学术语

一个正整数的阶乘factorial)是所有小于及等于该数的正整数,并且0的阶乘为1。自然数n的阶乘写作n!。1808年,基斯顿·卡曼引进这个表示法。

亦即n!=1×2×3×...×(n-1)×n。阶乘亦可以递归方式定义:0!=1,n!=(n-1)!×n。

二、递归写法

先看递归的函数写法:

/递归:
int Factorial(int n)
{
	if (n!= 0)
		return n* Factorial(n-1);
	return 1;
}

思路是这样的的:把 n! 看成是 n * (n-1)!,由此实现递归,同时要给递归加上限制条件:n 不等于零

三、非递归写法

先看非递归写法的代码:

//非递归:
int Factorial(int n)
{
	int count = 1;
	int i = 1;
	for (i = 1; i <= n; i++)
	{
		count *= i;
	}
	return count;
}

非递归的话,我选择了循环的方式。思路就是创建一个新变量 i ,并且 i 从1开始 ,循环到i <=n时停止,每次循环都把 i 的值乘到另一个变量 count ,这种写法是直接通过阶层的定义进行解题的

四、程序的全部代码

程序的所有代码如下图:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include<math.h>
 
 
//非递归:
int Factorial(int n)
{
	int count = 1;
	int i = 1;
	for (i = 1; i <= n; i++)
	{
		count *= i;
	}
	return count;
}
 
 
 
 
//递归:
//int Factorial(int n)
//{
//	if (n!= 0)
//		return n* Factorial(n-1);
//	return 1;
//}
 
 
 
 
int main()
{
	int n=0;
	scanf("%d", &n);
	int ret = Factorial(n);
	printf("%d", ret);
	return 0;
}

以上就是本篇博客的全部内容啦,如有不足之处,还请各位指出,期待能和各位一起进步!

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
递归算法是一种自己调用自己的算法解n的阶乘递归算法如下: ```python def factorial_recursive(n): if n == 0: return 1 else: return n * factorial_recursive(n-1) ``` 使用递归算法解n的阶乘的优点是代码简洁易懂。在处理问题时,能够直接体现问题的本质,更符合人类的思维方式。但递归算法也存在一些缺点。首先,递归会导致方法的调用次数增加,从而增加了方法的内存消耗。对于大规模的计算,可能会导致栈溢出。其次,递归算法的时间复杂度较高,因为递归算法需要反复调用自身,导致了重复计算,效率较低。当n较大时,递归算法的效果明显不如非递归算法非递归算法是通过循环迭代来解n的阶乘的,代码如下: ```python def factorial_non_recursive(n): result = 1 for i in range(1, n+1): result *= i return result ``` 非递归算法的优点是效率高,不会产生额外的方法调用,在计算大规模n的阶乘时,性能更好。但非递归算法的缺点是代码相对繁琐,可读性较差,不容易理解。 综上所述,递归算法非递归算法各有优劣。递归算法可读性好,但可能会产生栈溢出和重复计算;非递归算法效率高,但代码相对繁琐。在实际应用中,应根据具体情况选择合适的算法递归算法适用于问题本质明确且规模较小的情况,而非递归算法更适用于问题规模较大的情况。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱敲代码的罗根

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值