函数的递归调用
递归问题是一个说简单也简单,说难也有点难理解的问题.我想非常有必要对其做一个总结.
首先理解一下递归的定义,递归就是直接或间接的调用自身.而至于什么时候要用到递归,递归和非递归又有那些区别?又是一个不太容易掌握的问题,更难的是对于递归调用的理解.下面我们就从程序◆图形的角度对递归做一个全面的阐述.
我们从常见到的递归问题开始:
①. 阶层函数
#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()
cout x endl;
return 0;
这是一个递归求阶层函数的实现.很多朋友只是知道该这么实现的,也清楚它是通过不断的递归调用求出的结果.但他们有些不清楚中间发生了些什么.下面我们用图对此做一个清楚的流程:
int Fib(int n)
if (n = 1)
return n;
这个函数递归与上面的那个有些不同.每次调用函数都会引起另外两次的调用.最后将结果逐级返回.
我们可以看出这个递归函数同样在调用后买的函数时,前面的不退出而是在等待后面的结果,最后求出总结果.这就是递归.
void recursiveFunction1(int num)
cout num endl;
recursiveFunction1(num◆1);
recursiveFunction1(0);
运行结果:
该程序中有两个递归函数.传递同样的参数,但他们的输出结果刚好相反.理解这两个函数的调用过程可以很好的帮助我们理解递归:
我想能够把上面三个函数的递归调用过程理解了,你已经把递归调用理解的差不多了.并且从上面的递归调用中我们可以总结出递归的一个规律:他是逐级的调用,而在函数结束的时候是从最后面往前反序的结束.这种方式是很占用资源,也很费时的.但是有的时候使用递归写出来的程序很容易理解,很易读.
为什么使用递归:
①. 有时候使用递归写出来的程序很容易理解,很易读.
递归的条件:
并不是说所有的问题都可以使用递归解决,他必须的满足一定的条件.即有一个出口点.也就是说当满足一定条件时,程序可以结束,从而完成递归调用,否则就陷入了无限的递归调用之中了.并且这个条件还要是可达到的.
递归有哪些优点:
易读,容易理解,代码一般比较短.
递归有哪些缺点:
占用内存资源多,费时,效率低下.
所以呢在我们写程序的时候不要轻易的使用递归,虽然他有他的优点,但是我们要在易读性和空间,效率上多做权衡.一般情况下我们还是使用非递归的方法解决问题.若一个算法非递归解法非常难于理解.我们使用递归也未尝不可.如:二叉树的遍历算法.非递归的算法很难与理解.而相比递归算法就容易理解很多.
对于递归调用的问题,我们在前一段时间写图形学程序时,其中有一个四连同填充算法就是使用递归的方法.结果当要填充的图形稍微大一些时,程序就自动关闭了.这不是一个人的问题,所有人写出来的都是这个问题.当时我们给与的解释就是堆栈溢出.就多次递归调用占用太多的内存资源致使堆栈溢出,程序没有内存资源执行下去,从而被操作系统强制关闭了.这是一个真真切切的例子.所以我们在使用递归的时候需要权衡再三.
python不能无限的递归调用下去.并且当输入的值太大,递归次数太多时,python 都会报错
首先说结论,python解释器这么会限制递归次数,这么做为了避免"无限"调用导致的堆栈溢出.
tail recursion 就是指在程序最后一步执行递归.这种函数称为 tail recursion function.举个例子:
这个函数就是普通的递归函数,它在递归之后又进行了 乘 的操作. 这种普通递归,每一次递归调用都会重新推入一个调用堆栈.
把上述调用改成 tail recursion function
tail recursion 的好处是每一次都计算完,将结果传递给下一次调用,然后本次调用任务就结束了,不会参与到下一次的递归调用.这种情况下,只重复用到了一个堆栈.所以呢可以优化结构.就算是多次循环,也不会出现栈溢出的情况.这就是 tail recursion optimization .
c和c◆◆都有这种优化, python没有,所以限制了调用次数,就是为了防止无限递归造成的栈溢出.
如果递归次数过多,导致了开头的报错,可以使用 sys 包手动设置recursion的limit
手动放大 recursionlimit 限制:
递归式方法可以被用于解决很多的计算机科学问题,所以呢它是计算机科学中十分重要的一个概念.
绝大多数编程语言支持函数的自调用,在这些语言中函数可以通过调用自身来进行递归.计算理论可以证明递归的作用可以完全取代循环,所以呢在很多函数编程语言(如Scheme)中习惯用递归来实现循环.
计算机科学家尼克劳斯-维尔特如此描述递归:
递归的强大之处在于它允许用户用有限的语句描述无限的对象.所以呢,在计算机科学中,递归可以被用来描述无限步的运算,尽管描述运算的程序是有限的.
这个是递归函数,递归函数必须有收敛条件,收敛条件是x==1
一直递归到x==1就可以了
如果递归次数过多,系统就会有可能内存不足,不信你增大人数,比如计算100000个人的年龄可能会溢出,此为堆栈溢出,也就是没有堆栈空间了
以上就是土嘎嘎小编为大家整理的python递归函数缺点相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!