关于迭代和递归的思考
来源:互联网 发布:sun.java 编辑:程序博客网 时间:2024/05/29 13:16
迭代和递归必然能相互转化。它们都需要借助栈,递归的栈是保存函数和变量的递归栈,而迭代的栈需要程序员手动声明。
有些情况下,迭代比递归更节省复杂度,但是递归在任何情况下都和迭代的复杂度相同。在不需要栈的迭代中,如果转换为递归,则白白浪费了递归栈:比如遍历单链表,如果改为递归算法,则最深层递归跳出后(即访问最后一个节点),嵌套该层的递归层没有进行任何后续操作就跳出了,以此类推,知道最外层递归层跳出。因此最内层递归技术后,实际上所有有用的操作都结束了,剩下的唯一工作就是不停地跳出递归层,因此递归栈没有任何作用,牺牲了0(n)的空间复杂度。
而如果递归层跳出后,嵌套层需要做某些操作才能再次跳出的递归算法,则转换为迭代算法时,必须使用栈。因为迭代算法的游标移动时,原先的游标指向的数据到该层迭代的内部迭代结束后依然有用,因此不能抛弃,必须放入栈中,由后进先出的原则读取。
我们可以将不需要借助栈的迭代称之为“线性迭代”,而需要借助栈的迭代成为“非线性迭代”。所有编程语言的递归算法其实都是内部对迭代的封装,因为计算的内存和运算方式是线性的。
0 0
- 关于迭代和递归的思考
- 关于递归和迭代的一种效率分析
- 关于迭代测试的一些思考
- 关于敏捷迭代的思考
- 关于递归的思考
- 关于递归的思考
- 递归和迭代
- 递归和迭代
- 递归和迭代
- 递归和迭代
- 递归和迭代
- 递归和迭代
- 递归和迭代
- 递归和迭代
- 递归和迭代
- 递归和迭代
- 递归和迭代
- 递归和迭代
- 零基础学python-2.19 定义函数、调用函数与默认参数
- Java中Properties类的操作
- 利用ssh登录服务器
- wxPython Cookbook (Chatper1)part 2
- C++基础之语句笔记
- 关于迭代和递归的思考
- 利用OpenCV画HSV的3D直方图
- R Learning-swirl-lapply and sapply
- 用户注册登陆查询界面
- //实现中等难度通讯录。需求: //1、定义联系人类Contact。实例变量:姓名(拼音,首字母大写)、性别、电话号码、住址、分组名称、年龄。方法:自定义初始化方法(姓名、电话号码)、显示联系人信息
- Linux时间子系统之七:定时器的应用--msleep(),hrtimer_nanosleep()
- C/C++中关于qsort和sort函数的使用
- HDU 1022 Train Problem I
- 黑马程序员———Java编程基础之循环和函数