【C语言初阶】 递归函数实例讲解

本文通过三个实例介绍了递归编程的概念和应用,包括使用递归打印整数的每一位、实现strlen()函数以及计算斐波那契数列。递归的核心思想是将大问题分解为小问题,通过递推和回归的过程来解决。每个实例都配有详细的代码解释和递归过程的图形说明,帮助读者理解递归的工作原理。
摘要由CSDN通过智能技术生成

目录

实例一 :

实例二:

实例三:

总结 


 

实例一 :

 接受一个整形值,按顺序打印每一位,例:输入1234 输出:1 2 3 4;

在这里我们先使用我们迭代进行处理,这里我们只需要用循环就可以简单实现,实现代码如下;

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<math.h>

int print(int a)
{
	int i = 0;
	for (i = 0; i < 4; i++)
	{
		int j = 3 - i;
		int b = pow(10, j);
		int h = a /b;
		printf("%d ",h);
		a = a % b;
	}
	return 0;
}

int main()
{
	int a = 1234;
	print(a);
	return 0;
}

这里是博主实现的一种方法,既然我们讲的是递归,我们就用递归来实现一下;

递归的思想为:大型复杂的问题转化为与原问题相似规模较小问题

这里我们想打印:1 2 3 4;

我们可以把它分为:123  4;而这个实现就很简单,1234%10=4;

123还可以分为:12  3;实现方法一样,123%10=3;

12分为:1  2;依旧12%10=2;

最后只剩下1;

这时候我们只需要按照从后往前顺序打印即可,其实这就是递归的思想。

前面的一步步剥离往后一步步递,后面的打印过程就是归,那我们应该怎么样实现这个代码呢?

首先我们得明确递归实现的解题过程中遇到的重复计算,其次递归是直接或间接调用自身的一种方法;那我们来看一下这个过程中是否有着重复计算

73916dc8e6f94f0e968d5737fbdd68de.png

根据上图不难发现,一直在进行除10与模10; 

既然发现,我们不妨自己动手试一下,再试之前,我们得明确递归应满足的条件;

 递归的两个条件:

       1、 存在限制条件,当满足这个限制条件的时候,递归便不再继续。

        2、每次递归调用之后越来越接近这个限制条件。

明确这些,我们先写一个代码看一下,下面是博主写的代码和一些注释

void print(unsigned int n)
{
	if (n > 9)//约束条件
	{
	print(n/10);//逐渐向约束条件靠近
	}
	printf("%d ", n % 10);//当函数不满足约束条件时开始打印,也就是当n=1时
}

int main()
{
	int a = 1234;
	print(a);
	return 0;
}

两段代码对比后发现,递归代码量明显减少,下来我们来讲一下上面代码是如何实现的,博主借用了一个大牛的图给大家讲解一下

06c97ec0741f43afaf9a8a9c563825e7.png

 上面蓝色的线就是递推的过程,把1234一层层剥离,红色的线就是回归的过程,一步一步进行打印。此函数的在内存中开辟空间的方式也借用一下大牛的图给大家进行讲解

a198a57d461b4207a5faaa030d0d5812.png

每一次函数调用都要在栈区上分配-块内存空间用来保存丽数在调用过程中的上下文的信息。

如果有宝宝想要详细了解的更加详细,可以关注博主,并观看后续博主关于《函数的栈帧的创建与销毁》的讲解。

实例二:

使用递归实现strlen()函数的功能

与前面一题类似,我们得先将大型复杂的问题转化为与原问题相似规模较小问题

比如我们需要求得字符串为"abc",

int main()
{
	char arr[] = "abc";
	int len = my_strlen(arr);
	printf("%d\n", len);
	return 0;
}

  此时我们得明确在arr[]中abc存储为abc/0

这时候我们只需要按个从第一位进行判断,若为"/0",结束判断,不为则加一,最终判断结束输出即可;我们不难看出里面存在重复的判断和以为,以及加一,那我们便可以尝试进行实现,代码如下

int my_strlen(char* s)
{
    if (*s == '\0')//约束条件
		return 0;
	else
		return 1 + my_strlen(s + 1);//(s+1)为逐渐靠近约束条件,逐渐向后进行判断
}

这里由于博主画图能力不足,依旧借用大牛的图给大家讲解一下递归如何实现

abd979a82afc44da84deeee1f8cff178.png

 红色线为递推过程,蓝色线为回归过程。递推过程时会不断向约束条件靠近,当满足约束条件时,便会return 0;从而实现回归过程

实例三:

用递归实现求斐波那契(不考虑溢出)

首先我们的了解什么是斐波那契数,先给大家看一些斐波那契数

1 1 2 3 5 8 13....... .... ...

除最开始两个数,后面的数是前两的和。

如果需要我们求第n个斐波那契额数,我们就只需要知道n-1和n-2,知道n-1只需知道n-2和n-3,知道n-2只需知道n-3和n-4...... ......;

c1384e22ac024657854d3dfc6ac1596c.png

 

依次类推我们不难发现其中存在了大量的重复计算,那我们便可以尝试用递归思想进行解决。

我们发现要求一个数就得知道它前两个数,如果这个数太大,就像一棵倒着得数,程2得n次方增长,所以不考虑溢出,


int Fib(int n)
{
	if (n <= 2)//约束条件,满足条件是结束递推,开始回归
		return 1;
	else
		return Fib(n - 1) + Fib(n - 2);//逐渐向约束条件靠近
}

总结 

以上就是博主对实例的讲解,若有不对或者有问题的宝宝可以在评论区留言或者私信博主

 

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

遇事问春风乄

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

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

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

打赏作者

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

抵扣说明:

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

余额充值