标签:
一. 递归的慢究竟慢在哪
递归就是函数自己调用自己,函数每次调用的时候需要将以下内容存入递归栈:调用函数地址、形参、局部变量、返回值。所以如果递归调用了N次,那压栈操作要保存N * 调用函数地址、N * 局部变量、N * 形参、N * 返回值。这势必是影响效率的。
二. 递归和循环的比较:
递归和循环是两种不同的解决问题的思路,我们不能片面的说循环的效率一定会比递归高,下面我们做简单的分析:
1. 递归:
优点:代码简洁,清晰
缺点:它的运行需要较多次数的函数调用,如果调用层数比较深,需要增加额外的堆栈处理,甚至可能出现堆栈溢出的情况。因为递归的操作涉及到压栈、弹栈等操作,会对执行效率有一定影响。
如果编译器对函数调用做了较好的效率优化,那递归的效率未必低于循环。
2. 循环:
优点:结构简单,速度快(相对)
缺点:并不能解决所有问题,有些问题适合使用递归而不是循环(如:求阶乘)。
当然,如果使用循环解决很简单的话,最好还是用循环。
三. 递归使用的是什么栈
栈分为两种:系统栈和用户栈,递归使用的是用户栈。
1. 系统栈(又称核心栈、内核栈) 是内存中属于操作系统空间的一块区域,主要用途为:
(1). 保存中断现场,对于嵌套中断,被中断程序的现场信息一次压入系统栈,中断返回时逆序弹出。
(2). 保存操作系统子进程间相互调用的返回点、参数、局部变量、返回值。
2. 用户栈是用户进程空间中的一块区域,用户保存用户进程的子程序间相互调用的返回点、参数、局部变量、返回值。
转自:http://www.nowamagic.net/librarys/veda/detail/2322
标签:
原文地址:http://blog.csdn.net/zdp072/article/details/45054393