问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

Python3:怎么通过递归函数

发布网友 发布时间:2022-04-25 23:17

我来回答

1个回答

热心网友 时间:2022-04-07 12:56

函数的递归调用
递归问题是一个说简单也简单,说难也有点难理解的问题.我想非常有必要对其做一个总结.
首先理解一下递归的定义,递归就是直接或间接的调用自身.而至于什么时候要用到递归,递归和非递归又有那些区别?又是一个不太容易掌握的问题,更难的是对于递归调用的理解.下面我们就从程序+图形的角度对递归做一个全面的阐述.
我们从常见到的递归问题开始:
1 阶层函数
#include <iostream>
using namespace std;
int factorial(int n)
{
if (n == 0)
{
return 1;
}
else
{
int result = factorial(n-1);
return n * result;
}
}
int main()
{
int x = factorial(3);
cout << x << endl;
return 0;
}
这是一个递归求阶层函数的实现。很多朋友只是知道该这么实现的,也清楚它是通过不断的递归调用求出的结果.但他们有些不清楚中间发生了些什么.下面我们用图对此做一个清楚的流程:
根据上面这个图,大家可以很清楚的看出来这个函数的执行流程。我们的阶层函数factorial被调用了4次.并且我们可以看出在调用后面的调用中,前面的调用并不退出。他们同时存在内存中。可见这是一件很浪费资源的事情。我们该次的参数是3.如果我们传递10000呢。那结果就可想而知了.肯定是溢出了.就用int型来接收结果别说10000,100就会产生溢出.即使不溢出我想那肯定也是见很浪费资源的事情.我们可以做一个粗略的估计:每次函数调用就单变量所需的内存为:两个int型变量.n和result.在32位机器上占8B.那么10000就需要10001次函数调用.共需10001*8/1024 = 78KB.这只是变量所需的内存空间.其它的函数调用时函数入口地址等仍也需要占用内存空间。可见递归调用产生了一个不小的开销.
2 斐波那契数列
int Fib(int n)
{
if (n <= 1)
{
return n;
}
else
{
return Fib(n-1) + Fib(n-2);
}
}
这个函数递归与上面的那个有些不同.每次调用函数都会引起另外两次的调用.最后将结果逐级返回.
我们可以看出这个递归函数同样在调用后买的函数时,前面的不退出而是在等待后面的结果,最后求出总结果。这就是递归.
3
#include <iostream>
using namespace std;
void recursiveFunction1(int num)
{
if (num < 5)
{
cout << num << endl;
recursiveFunction1(num+1);
}
}
void recursiveFunction2(int num)
{
if (num < 5)
{
recursiveFunction2(num+1);
cout << num << endl;
}
}
int main()
{
recursiveFunction1(0);
recursiveFunction2(0);
return 0;
}
运行结果:
0
1
2
3
4
4
3
2
1
0
该程序中有两个递归函数。传递同样的参数,但他们的输出结果刚好相反。理解这两个函数的调用过程可以很好的帮助我们理解递归:
我想能够把上面三个函数的递归调用过程理解了,你已经把递归调用理解的差不多了.并且从上面的递归调用中我们可以总结出递归的一个规律:他是逐级的调用,而在函数结束的时候是从最后面往前反序的结束.这种方式是很占用资源,也很费时的。但是有的时候使用递归写出来的程序很容易理解,很易读.
为什么使用递归:
1 有时候使用递归写出来的程序很容易理解,很易读.
2 有些问题只有递归能够解决.非递归的方法无法实现.如:汉诺塔.
递归的条件:
并不是说所有的问题都可以使用递归解决,他必须的满足一定的条件。即有一个出口点.也就是说当满足一定条件时,程序可以结束,从而完成递归调用,否则就陷入了无限的递归调用之中了.并且这个条件还要是可达到的.
递归有哪些优点:
易读,容易理解,代码一般比较短.
递归有哪些缺点:
占用内存资源多,费时,效率低下.
因此在我们写程序的时候不要轻易的使用递归,虽然他有他的优点,但是我们要在易读性和空间,效率上多做权衡.一般情况下我们还是使用非递归的方法解决问题.若一个算法非递归解法非常难于理解。我们使用递归也未尝不可.如:二叉树的遍历算法.非递归的算法很难与理解.而相比递归算法就容易理解很多.
对于递归调用的问题,我们在前一段时间写图形学程序时,其中有一个四连同填充算法就是使用递归的方法。结果当要填充的图形稍微大一些时,程序就自动关闭了.这不是一个人的问题,所有人写出来的都是这个问题.当时我们给与的解释就是堆栈溢出。就多次递归调用占用太多的内存资源致使堆栈溢出,程序没有内存资源执行下去,从而被操作系统强制关闭了.这是一个真真切切的例子。所以我们在使用递归的时候需要权衡再三.
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
李卓彬工作简历 林少明工作简历 广东工业职业技术学院怎么样 郑德涛任职简历 唐新桂个人简历 土地入股的定义 ups快递客服电话24小时 贷款记录在征信保留几年? 安徽徽商城有限公司公司简介 安徽省徽商集团新能源股份有限公司基本情况 什么是AGPS技术 python中递归函数写法 手机定位AGpS的设置 msa与msb区别 2022国考笔试结果什么时间出?什么时间进行面试? 冰美式在星巴克叫什么? 惠普打印机打印的时候出现传真安装程序怎么办 四川南充2022上半年公务员考试笔试成绩查询以及计算方法 csgo igxez买的东西怎么拿到 2022年青海省公务员考试笔试结束后注意事项有哪些? 冰美式不加冰什么意思 热美式和冰美式的区别是什么? 例如box818这样的csgo饰品网站,如何将皮肤提取到游戏库存呢? 2022上半年四川省考试录用公务员考试,笔试成绩查询时间? 2022上半年四川*组织部省级机关(单位)公*笔试成绩查询以及计算方法 csgofarmskin怎么取回 半杯冰美式是什么意思 csgo f网新手开箱是不是必须得冲钱才能取回武器? 2022天津公*笔试:如何开展分类分级考试,笔试成绩怎样合成? 星巴克冰美式怎么喝好喝? python中如何使用递归实现这个功能 python如何用递归函数求1+2+3+4+5的值 关于python递归函数实现汉诺塔 请问目前主流Android 定位有哪些,还有百度定位和gps定位有什么区别 微信群群主变成了企业,微信群突然变成了企业外部群,该怎么办?_百度问一问 有AGPS和没有AGPS有什么区别?没有一样能上网导航拜托各位大神 python中在函数中调用另一个函数,这就是函数_调用? 我的手机是 安卓系统的,支持AGPS,就是不知道怎么打开AGPS,在导航的时候用那个GPS定位都很慢 使用函数嵌套调用和递归函数编写代码(1!)平方+(2!)平方只和Python python 递归函数与return 小白有一个关于python递归的问题 求教 请问python中类里面的方法可以递归吗?如果可以递归的话怎么用? 用Python写编写一个递归函数,1+1÷2+1÷3+……+1÷i? 如何省购置税买车? 买车怎么能免购置税 我国新型家用中央空调的类型有哪些? 拿下面两个手是什么字 现在买车怎样才能享受到购置税减半? 中央空调 分类 吃东西用两个手拿不雅吗?