【C语言】题目15 - 递归实现N的阶乘计算✅

296 阅读3分钟

Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情

Hello,大家好,我是泽奀,一起学习进步(●'◡'●)。
✉️我们并非登上我们所选择的舞台,演出并非我们所选择的剧本📩

前言

今天又开始C语言刷题练习,冲冲冲,坚持就是胜利加油奥里给!!!

题目描述

递归实现N的阶乘计算✅

题目分析

这道题目如果你不知道递归那是完全做不来的,所以我们来说说递归!

程序调用自身的编程技巧称为递归。递归作为一种算法在程序设计语言中是广泛应用的。一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题转换位一个与原问题相似的规模较小的问题来去进行求解,递归策略只需少了的程序就可以描述出解题的过程所需要的多次重复计算,大大减少了程序的代码量。递归的人主要思考方式就在于:把大事化小。递归之所以能够实现,是因为函数的每个执行过程在栈中都有自己的形参和局部变量的副本,这些副本和和该函数的其它执行过程是不会发生关系的。

注意:当递归进入到最内层的时候,递归就结束了,就开始逐层退出了,也就是逐层执行 return 语句。当执行最后层的 return 之后,就执行上面一层的递归!

再来说说递归的条件

  • 每一个递归函数都应该只进行有限次的递归调用,否则它就会进入死胡同,永远也不能退出了,这样的程序是没有意义的。
  • 存在限制条件,当满足这个限制条件之后的时候,递归便会不再继续。
  • 每次递归调用之后都会越来越接近这个限制条件

阶层实际上就是假如5的阶层:5x4x3x2x1 同理。

代码示例

#include<stdio.h>
int face(int n)
{
	if (n <= 1)
		return 1;
	else
		return n*face(n - 1);
}
int main(void)
{
	int n = 0;
	printf("请输入你的数字:");
	scanf_s("%d", &n);
	int ret = face(n);
	printf("%d\n", ret);
}

看看下列数字,不知道你get到了吗?

5 * face(4) → 调用形式face(5)
4 * face(3) → 调用形式face(4)
3 * face(2) → 调用形式face(3)
2 * face(1) → 调用形式face(2)
1 * face(0) → 调用形式face(1)

1 * wu       → 调用形式face(1)  表达式当前调用的值:1
2 * face(1) → 调用形式face(2)  表达式当前调用的值:2
3 * face(2) → 调用形式face(3)  表达式当前调用的值:6
4 * face(3) → 调用形式face(4)  表达式当前调用的值:24
5 * face(4) → 调用形式face(5)  表达式当前调用的值:120

1 * wu = 1
2 * 1 = 2
3 * 2 = 6
4 * 6 = 24
5 * 24 = 120

运行结果

假设输入5,那么结果为:5x4x3x2x1=120

最后

其实这种题目不用递归也可以完成,用循环 输入 再总数相加,打印即可。
但是,递归这个还是必须要学会的。