C语言基础:函数递归(内含详细图解)

文章介绍了递归的概念,即程序在运行过程中调用自身,强调递归需存在限制条件以防止无限递归导致栈溢出。通过打印数字的每一位和求字符串长度的实例展示了递归的使用,并指出在无法清晰用递归实现时可以考虑迭代作为替代方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是递归?

· 递归,就是在运行的过程中不断地调用自己,程序调用自身的编程技巧称为递归。

· 递归主要在于递推与回归。       

· 递归好处:代码更简洁清晰,可读性更好 。

· 递归的主要思考方式在于:大事化小。


递归的两个必要条件

· 递归一定存在限制条件,当满足这个限制条件时,递归便不再继续

· 每次递归调用后都会越来越接近这个限制条件

       如果缺少这两个必要条件,会导致递归不断深入,不断向内存申请空间,最终内存空间不足导致程序的崩溃。所以我们在写递归代码时一定要注意这两点!


递归实例

接下来我们用几个例子来帮助我们学习递归的使用

1、接受一个整型值,按顺序打印它的每一位

(例如:输入1234 打印 1 2 3 4

首先,编写一个代码输入一个整型值:

#include<stdio.h>
int main()
{
	int num;
	scanf("%d", &num);   //输入1234 使num=1234
	return 0;
}

然后我们需要明白这个例子的递归原理:

我们使用一个print()函数来实现以上内容:

void print(int n)
{
	if (n > 9)
	{
		print(n / 10);
	}
	printf("%d ", n % 10);
}

 由此,我们就成功实现了将1234的逐位打印:

#include<stdio.h>
void print(int n)
{
	if (n > 9)
	{
		print(n / 10);
	}
	printf("%d ", n % 10);
}
int main()
{
	int num;
	scanf("%d", &num);   //输入1234 使num=1234
	print(num);

	return 0;
}


2、编写函数不允许创建临时变量,求字符串的长度 

        原理很简单,我们只需计算出'\0'前的每一位即可,与strlen函数同理,我们构建一个自己的my_syrlen函数。

首先给出主函数:

#include<stdio.h>
int main()
{
	char arr[] = "abc";
	int len = my_strlen(arr);  //用来接受函数返回的字符串长度
	printf("%d\n", len);
	return 0;
}

       要求字符串长度,我们可以从头开始一位一位往后判断是不是'\0',如果不是,返回值的长度+1,如果是,则证明这个字符串的长度就到这里了,返回值的长度为0。

int my_strlen(char* arr)
{
	if (*arr == '\0')
		return 0;
	else
		return 1 + my_strlen(arr + 1);
}

 由此,我们成功实现了求字符串的长度:

#include<stdio.h>
int my_strlen(char* arr)
{
	if (*arr == '\0')
		return 0;
	else
		return 1 + my_strlen(arr + 1);
}
int main()
{
	char arr[] = "abc";
	int len = my_strlen(arr);  //用来接受函数返回的字符串长度
	printf("%d\n", len);
	return 0;
}

使用递归的注意事项

       我们使用递归时,递归调用的层次不能太过深。系统分配给程序的栈空间是有限的,但是如果出现了死循环(或者死递归),这样有可能导致一直开辟空间,最终产生栈空间耗尽的情况,这种现象我们称为栈溢出。

       许多问题用递归实现只是因为他比非递归的形式更为清晰。当一个问题相当复杂,难以用递归实现时,我们不要强求,我们可以使用迭代来实现,虽然代码的可读性会稍微差一些。


以上就是 C语言基础:函数递归(内含详细图解)的全部内容了,希望对你有所帮助!

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值