关于递归和循环

一. 递归的慢究竟慢在哪

递归就是函数自己调用自己,函数每次调用的时候需要将以下内容存入递归栈:调用函数地址、形参局部变量、返回值。所以如果递归调用了N次,那压栈操作要保存N * 调用函数地址、N * 局部变量、N * 形参、N * 返回值。这势必是影响效率的。


二. 递归和循环的比较:

递归和循环是两种不同的解决问题的思路,我们不能片面的说循环的效率一定会比递归高,下面我们做简单的分析:

1. 递归:

优点:代码简洁,清晰

缺点:它的运行需要较多次数的函数调用,如果调用层数比较深,需要增加额外的堆栈处理,甚至可能出现堆栈溢出的情况。因为递归的操作涉及到压栈、弹栈等操作,会对执行效率有一定影响。

如果编译器对函数调用做了较好的效率优化,那递归的效率未必低于循环。

2. 循环:

优点:结构简单,速度快(相对)

缺点:并不能解决所有问题,有些问题适合使用递归而不是循环(如:求阶乘)。

当然,如果使用循环解决很简单的话,最好还是用循环。


三. 递归使用的是什么栈

栈分为两种:系统栈和用户栈,递归使用的是用户栈。

1. 系统栈(又称核心栈、内核栈) 是内存中属于操作系统空间的一块区域,主要用途为:

(1). 保存中断现场,对于嵌套中断,被中断程序的现场信息一次压入系统栈,中断返回时逆序弹出。

(2). 保存操作系统子进程间相互调用的返回点、参数局部变量、返回值。

2. 用户栈是用户进程空间中的一块区域,用户保存用户进程的子程序间相互调用的返回点、参数、局部变量、返回值。

转自:http://www.nowamagic.net/librarys/veda/detail/2322


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值