Reading 16: Recursive Data Type学习心得

递归
递归就是一个函数在它的函数体内调用它自身。执行递归函数将反复调用其自身,每调用一次就进入新的一层。递归函数必须有结束条件。
当函数在一直递推,直到遇到墙后返回,这个墙就是结束条件。
所以递归要有两个要素,结束条件与递推关系
注:
递归的时候,每次调用一个函数,计算机都会为这个函数分配新的空间,这就是说,当被调函数返回的时候,调用函数中的变量依然会保持原先的值,否则也不可能实现反向输出。
递归函数特点:

  1. 每一级函数调用时都有自己的变量,但是函数代码并不会得到复制,如计算5的阶乘时每递推一次变量都不同;
  2. 每次调用都会有一次返回,如计算5的阶乘时每递推一次都返回进行下一次;
  3. 递归函数中,位于递归调用前的语句和各级被调用函数具有相同的执行顺序;
  4. 递归函数中,位于递归调用后的语句的执行顺序和各个被调用函数的顺序相反;
  5. 递归函数中必须有终止语句。
    一句话总结递归:自我调用且有完成状态。
    系统栈(也叫核心栈、内核栈)
    是内存中属于操作系统空间的一块区域,其主要用途为: (1)保存中断现场,对于嵌套中断,被中断程序的现场信息依次压入系统栈,中断返回时逆序弹出; (2)保存操作系统子程序间相互调用的参数、返回值、返回点以及子程序(函数)的局部变量。
    用户栈
    是用户进程空间中的一块区域,用于保存用户进程的子程序间相互调用的参数、返回值、返回点以及子程序(函数)的局部变量。
    我们编写的递归程序属于用户程序,因此使用的是用户栈。
    栈溢出
    函数调用的参数是通过栈空间来传递的,在调用过程中会占用线程的栈资源。而递归调用,只有走到最后的结束点后函数才能依次退出,而未到达最后的结束点之前,占用的栈空间一直没有释放,如果递归调用次数过多,就可能导致占用的栈资源超过线程的最大值,从而导致栈溢出,导致程序的异常退出。
    综上:
    函数调用的时候,每次调用时要做地址保存,参数传递等,这是通过一个递归工作栈实现的。具体是每次调用函数本身要保存的内容包括:局部变量、形参、调用函数地址、返回值。那么,如果递归调用N次,就要分配N次局部变量、N次形参、N次调用函数地址、N次返回值,势必效率低.

ADP编程
抽象意味着什么:抽象数据类型是软件工程中一般原理的一个实例,它有许多名称,其意义略有不同:
抽象:用更简单,更高层次的概念来省略或隐藏底层细节。
模块化:将系统划分为组件或模块,每个组件可以与系统的其他部分分开设计,实施,测试,推理和重复使用。
封装:围绕模块构建墙壁(硬壳或胶囊),使模块对其自身的内部行为负责,并且系统其他部分的错误不会损害其完整性。
信息隐藏:从系统的其他部分隐藏模块实现的细节,以便稍后可以更改这些细节,而无需更改系统的其余部分。

用户定义类型:
在软件开发方面一个重大的进展就是抽象数据类型的提出。数据抽象的关键思想是:一个类型被可以对其进行的操作特征化。比如说,一个数字是你可以进行加法或者乘法运算的类型,一个字符串是你可以连接或者获得其子字符串的类型等等。从某种意义上说,用户可以在早期的编程语言中定义自己的类型,但是抽象类型的新颖性和不同之处在于它对操作的关注,用户不需要担心它的值是如何存储,只需要知道如何对这些值进行操作。
类型分类与操作:
无论是用户自己定义的还是内置的类型,都可以被分为可变的和不可变的。可变类型的对象可以被改变,也就是说,他们提供的操作在执行时会导致在同一个对象上的其他操作给出不同的结果。如Date是可变的,我们可以调用setMonth改变一个对象,并使用getMonth观察变化。String是不可变的,因为他的操作创建了一个新的String对象而不是对现有的String对象进行改变。有时一种类型将以两种形式提供,一种是可变的一种是不可变的。如StringBuild就是String的一个可变版本。
总结:
数据类型定义:一种思考抽象类型(尤其是递归类型)的强大方法
递归数据类型上的函数:在类型的规范中声明,并为每个具体变体一个案例实现
不可变列表:不可变数据类型的经典规范示例
与往常一样,我们询问这些想法如何使我们的代码更安全,免受错误的影响,更易于理解,并为更改做好准备。再次查看 ImList 中 size() 的定义和实现。这个定义只不过是大小的数学定义。代码只不过是定义,有一些分号来安抚编译器。
如果我们检查其他方法的定义 - ,,等 - 在每种情况下,我们都会看到一个安全,易于阅读的实现等待编码。由于我们花时间指定了这些操作,因此如果我们避免了代表暴露并保持了代表的独立性,我们知道我们的代码已经准备好进行更改:不同的客户端将能够重用我们的数据类型,并且我们将能够在不破坏它们的情况下更新实现。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值