
2个回答
展开全部
打个比方,栈是一个类似于桶的东西,先进桶的东西,会被压在桶底,后面放的东西会放在桶面。每次函数的调用都会产生另外的开销,一个父函数调用子函数时候,会先在寄存器保存父函数的当前状态,包括当前指令地址信息,也就是类似于将这些信息先放桶底部,然后再将子函数参数等信息再继续放入桶里,也就是桶面,子函数执行结束后,会将刚才为了执行子函数放入桶里的信息出栈,桶里就露出了一开始保存在桶底的父函数的下一个指令地址(桶底变成桶面了),这时候再将这个指令取出继续往后执行。因为每次函数的调用都有类似的进栈出栈操作,而递归就是函数本身调用自己,当然也会产生类似的进栈出栈操作,产生另外的开销。
而非递归时候,也就是迭代时候,是在同一个函数内部进行的循环操作,没有另外调用子函数产生的开销,所以大部分情况下非递归形式要比递归形式速度稍快。另外递归消耗的内存也要比迭代多,因为在不同递归层数里面定义的变量都需要另外分配内存,不像非递归只定义一次,只分配一次。
而非递归时候,也就是迭代时候,是在同一个函数内部进行的循环操作,没有另外调用子函数产生的开销,所以大部分情况下非递归形式要比递归形式速度稍快。另外递归消耗的内存也要比迭代多,因为在不同递归层数里面定义的变量都需要另外分配内存,不像非递归只定义一次,只分配一次。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询