【C语言】函数递归的详细解释

本文介绍了递归的概念,包括递归的递推和回归本质,强调了递归的限制条件以及如何设置。通过求阶乘和顺序打印整数的示例展示了递归的应用,同时比较了递归与迭代的效率,并以斐波那契数列为例,说明迭代求解的效率优势。
摘要由CSDN通过智能技术生成

1.什么是递归

所谓递归就是函数在内部中自己调用自己。把一个大的问题转化成一个个小问题来解决,即大事化小事
话说简单,可我们要如何去理解这一个问题呢?首先我们要明白递归的含义是:递归中的——递推 ,就是要我们从计算开始一步一步的递推回到它的第一个数, 递归中的——回归,那就是把已经计算好的结果又一步一步返回到它要计算的数里。其次,要寻找递归的限制条件是什么

2.递归的限制条件

@我们要明白所用的函数是用来干什么的
@当递推到满足条件的时候,递归就停止继续。如果这个条件不满足,它就会一直在自己调用自己,形成类似于无限循环似的,永远都在自己调用自己的状态,
@每次递归调用之后不断缩小参数范围,

3.递归

(1)示例:求n的阶乘

n的阶乘递归公式:

在这里插入图片描述

假设fat(n)就是求n的阶乘,那么fat(n-1)就是求n-1的阶乘

#include<stdio.h>

int fat(int a) {
	if (a == 0)
	//停下来的条件
		return 1;
	else
		return  a * fat(a - 1);
}
int main() {
	int n = 0;
	scanf("%d",&n);
	int ret = fat(n);
	printf("%d\n", ret);
	return 0;
}

画图解释
在这里插入图片描述

运行结果
在这里插入图片描述

(2)示例:顺序打印一个整数的每一位

输入:1234 输出:1 2 3 4

#include<stdio.h>

void print(int a) {
	if (a > 9) {
		print(a / 10);
	}
	printf("%d", a % 10);
}
int main() {
	int n = 0;
	scanf("%d", &n);
	print(n);
}

画图解释
在这里插入图片描述

运行结果
在这里插入图片描述

3.递归与迭代.

每一次对过程的重复称为一次“迭代”,(循环也是迭代的一种方式)而每一次迭代得到的结果会作为下一次迭代的初始值。重复执行一系列运算步骤,从前面的量依次求出后面的量的过程。此过程的每一次结果,都是由对前一次所得结果施行相同的运算步骤得到的。

示例:1:计算n的阶乘,可以产生1~n的数字累计乘在一起的(用迭代的方式来求)

int Fact(int n) {
	int i = 0;
	int ret = 1;
	for (i = 1; i <= n; i++) {
		ret *= i;
	}return ret;
}
int main() {
	int a;
	scanf("%d", &a);
	int av=Fact(a);
	printf("%d\n", av);
	return 0;
}

运行结果
在这里插入图片描述
许多问题是以递归的形式进行解释,那是因为它比非递归(迭代
)的形式更加清晰,但这些问题的迭代实现往往比递归实现效率更高。

示例2:斐波那契数列(方法:迭代)
斐波那契数列(Fibonacci Sequence)又称黄金分割数列。该数列指的是这样的一列数字:0、1、1、2、3、5、8、13、21、34、55、89、144、233、377、610、987、1597、2584、4181、6765、10946、17711、28657、46368…
  特别指出:第0项是0,第1项是第一个1。此数列从第2项开始,每一项都等于前两项之和。

#include<stdio.h>

int Fib(int n) {
	int a = 1;
	int b = 1;
	int c = 0;
	while (n>=3) {
		c = a + b;
		a = b;
		b = c;
		n--;
	}
	return c;
}
int main() {
	int n = 0;
	scanf("%d", &n);
	int ret = Fib(n);
	printf("%d\n", ret);
	return 0;
}

运行结果
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值