python递归函数参数 python递归函数详解( 二 )


return n * result;
}
}
int main()
{
int x = factorial(3);
coutxendl;
return 0;
}
这是一个递归求阶层函数的实现 。很多朋友只是知道该这么实现的,也清楚它是通过不断的递归调用求出的结果.但他们有些不清楚中间发生python递归函数参数了些什么.下面我们用图对此做一个清楚的流程:
根据上面这个图,大家可以很清楚的看出来这个函数的执行流程 。我们的阶层函数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 (num5)
{
coutnumendl;
recursiveFunction1(num+1);
}
}
void recursiveFunction2(int num)
{
if (num5)
{
recursiveFunction2(num+1);
coutnumendl;
}
}
int main()
{
recursiveFunction1(0);
recursiveFunction2(0);
return 0;
}
运行结果:
1
2
3
4
4
3
2
1
该程序中有两个递归函数 。传递同样的参数,但他们的输出结果刚好相反 。理解这两个函数的调用过程可以很好的帮助我们理解递归:
我想能够把上面三个函数的递归调用过程理解了 , 你已经把递归调用理解的差不多了.并且从上面的递归调用中我们可以总结出递归的一个规律:他是逐级的调用,而在函数结束的时候是从最后面往前反序的结束.这种方式是很占用资源,也很费时的 。但是有的时候使用递归写出来的程序很容易理解 , 很易读.
为什么使用递归:
1 有时候使用递归写出来的程序很容易理解,很易读.
2 有些问题只有递归能够解决.非递归的方法无法实现.如:汉诺塔.
递归的条件:
并不是说所有的问题都可以使用递归解决,他必须的满足一定的条件 。即有一个出口点.也就是说当满足一定条件时,程序可以结束,从而完成递归调用 , 否则就陷入了无限的递归调用之中了.并且这个条件还要是可达到的.
递归有哪些优点:
易读,容易理解,代码一般比较短.
递归有哪些缺点:
占用内存资源多 , 费时,效率低下.
因此在我们写程序的时候不要轻易的使用递归,虽然他有他的优点 , 但是我们要在易读性和空间 , 效率上多做权衡.一般情况下我们还是使用非递归的方法解决问题.若一个算法非递归解法非常难于理解 。我们使用递归也未尝不可.如:二叉树的遍历算法.非递归的算法很难与理解.而相比递归算法就容易理解很多.

推荐阅读