函数递归的基本知识

0.目录

一.什么是递归

二.递归的限制条件

三.递归的举例

四.递归与迭代

1.什么是递归

递归其实是一种解决问题的方法,在c语言中:递归就是函数自己调用自己。
写一个最简单的递归代码:

include<stdio.h>
int  main()
{
printf("hehe\n");
main();//调用
return 0;
}

上述代码,在main函数中调用main函数,这就是递归。不过这个例子不太恰当,它会无限循环,运行代码会造成死循环,造成栈溢出

栈溢出:每一次函数调用,都要为这一次函数调用分配内存空间,是内存中的栈区上分配的,如果无限的递归调用函数,就会将栈区内存空间填满(用完),这时就会出现栈溢出的现象。如下图:
在这里插入图片描述

1.1递归的思想

递归的思考方式就是把大事化小的过程。
递归中的递就是递推 的意思,归就是回归的意思。

1.2递归的限制条件

1.递归存在限制条件,当满足这个限制条件,便不再继续。(上述main函数就是反例)
2.每次递归调用之后越来越接近这个限制条件。

2.递归举例

2.1

举例1:求n的阶乘
在这里插入图片描述
在这里插入图片描述
看不懂的看下图:
在这里插入图片描述
递归是少量的代码完成了大量的运算!

2.2

举例2:顺序打印一个整数的每一位
比如:
输入:1234
打印:1 2 3 4
参考代码:
在这里插入图片描述
逻辑导图:
在这里插入图片描述

3.递归与迭代

在c语言中每一次函数调用,都需要在本次函数调用在内存的栈区申请一块内存空间来保存函数调用期间各种局部变量的值,这块空间被称为运行时堆栈或者函数栈帧

函数不返回,函数对应的栈帧空间就会一直占用,所以如果函数调用中存在递归调用的话,每一次递归函数调用都会开辟属于自己的栈帧空间,直到函数递归不再继续,开始回归,才逐层释放栈帧空间。

所以如果采用函数递归的方式完成代码,递归层次太深,就会浪费太多的栈帧空间,也可能引起栈溢出的问题。

所以如果不想使用递归,就得想其他办法,通常就是迭代的方式(循环可以实现迭代,但是迭代不仅仅是循环)
在这里插入图片描述

3.1

举例3:求第n个斐波那契数。

解释斐波那契数列:前两个数为1,后面数为前两个数之和。
1 1 2 3 5 8 13 21 34 55…

所以如果求第n个斐波那契数,那就是n的前两个数的和。
逻辑导图:
在这里插入图片描述

参考代码:
在这里插入图片描述
这个问题用递归解决其实并不合适,因为其中会有很多重复计算,反而用循环的方式会很简便。
参考代码如下;
在这里插入图片描述
递归虽好,但也不要迷恋递归,适可而止就好。

  • 18
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值