【C语言基础学习笔记】三、函数(2)--- 函数递归详解

The best time to plant a tree was 10 years ago. The second best time is now
翻译:种一棵树最好的时间是十年前,其次是现在
所谓运气,不过是机会碰巧遇到了你的努力

本章内容是对递归详细讲解,中间穿插了较多的递归经典案例,方便我们理解递归的思想以及使用递归去解决实际的问题。



1、函数递归

什么是递归:程序调用自身的编程技巧称为递归(recursion)。递归做为一种算法在程序设计语言中广泛应用。一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。

递归的主要思考方式在于 : 把大事化小
注意:函数在调用的时候会向内存申请空间。(递归的过程就是函数的不停调用过程)

最简单的递归函数:主函数调用主函数

#include<stdio.h>
int main()
{
   
	printf("hello world\n");
	main();
	return 0;
}

上述代码结果:死循环,栈溢出(stack overflow)
在这里插入图片描述
为什么会出现栈溢出呢?
要想搞懂栈溢出的原因,首先我们要明白程序运行过程中内存的划分分区
在这里插入图片描述

每一次函数的调用,都需要在栈区分配一定的空间(也就是说函数调用也在栈区开辟空间),调用次数太多,栈空间不够分配(被耗干),导致栈溢出。


练习1 : (画图讲解)

接受一个整型值(无符号),按照顺序打印它的每一位。例如︰输入∶1234,输出1234.
要顺序打印它的每一位,就需要得到它的每一位,1234最容易得到的就是个位
1234 % 10 = 4
1234 / 10 = 123 % 10 = 3
123 / 10 = 12 % 10 = 2
12 / 10 = 1 % 10 = 1
1 / 10 = 0

#include<stdio.h>
void print(int n)
{
   
	if (n > 9)
	{
   
		print(n / 10);
	}
	printf("%d ", n % 10);
}
int main()
{
   
	unsigned int num = 0;
	scanf("%d", &num);//1234
	print(num);//打印1 2 3 4
	//print(1234)
	//print(123) 4
	//print(12) 3 4
	//print(1) 2 3 4
	//      1   2  3 4  
	//当()里面的数字大于9的时候就拆分,小于9,为个位数的时候停止拆分,进行打印
	return 0;
}

画图详解:
在这里插入图片描述


比较上面两个递归函数,我们可以看到: 递归的两个必要条件
①存在限制条件,当满足这个限制条件的时候,递归便不再继续。
②每次递归调用之后越来越接近这个限制条件。

注意:这两个条件是必要条件,不是充分条件,也就是说递归函数一定满足这两个条件,但是满足这两个条件不一定是递归。看下面这个例子:
在这里插入图片描述
按F10进行调试:
在这里插入图片描述
每一次函数的调用,都需要在栈区分配一定的空间,调用次数太多,栈空间不够分配(被耗干),导致栈溢出。

所以我们在写递归代码的时候,一定要注意以下几点:
1、不能死递归,要有跳出条件,每次递归逼近跳出条件
2、递归层层不能太深


练习2∶(画图讲解)

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

初步解题思路:

#include<stdio.h>
#include<
  • 36
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

大家好我叫张同学

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

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

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

打赏作者

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

抵扣说明:

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

余额充值