20172302 《程序设计与数据结构》第十周学习总结


2018年学习总结博客总目录:[第一周](http://www.cnblogs.com/hzy0628/p/8539037.html) [第二周](http://www.cnblogs.com/hzy0628/p/8584976.html) [第三周](http://www.cnblogs.com/hzy0628/p/8642935.html) [第四周](http://www.cnblogs.com/hzy0628/p/8671888.html) [第五周](http://www.cnblogs.com/hzy0628/p/8746606.html) [第六周](http://www.cnblogs.com/hzy0628/p/8830819.html) [第七周](http://www.cnblogs.com/hzy0628/p/8870071.html) [第八周](http://www.cnblogs.com/hzy0628/p/8940111.html) [第九周](http://www.cnblogs.com/hzy0628/p/9027708.html) [第十周](http://www.cnblogs.com/hzy0628/p/9059757.html)

教材学习内容总结

1.集合是一种对象。从保存类型来看,集合有两种:同构集合,只能保存类型全部相同的对象;异构集合,可以保存各种类型的对象。

2.一个抽象数据类型(ADT)是由数据和在该数据上所实施的操作构成的集合,一个ADT有名称、值域和一组允许执行的操作。术语“集合”与“抽象数据类型”是可以互换的等同概念。

3.先讨论数组和ArrayList类,数组的缺陷在于它必须是要有固定的大小,而且在使用过程中不能修改;而ArrayList类可以改变大小,但每次扩大数组时,都是在做创建一个更大的数组并将原数据复制到其中去,这样会效率很低下,并不高效。这时,我们引入动态数据结构,它用链来实现,利用对象引用作为连接对象间的链,就可以完成各种情况的数据结构。

4.建立动态结构的链,见下,实例化两个Node类对象,并使一个Node对象的引用变量next指向另一个Node对象,从而将两个对象链接起来。

class Node
{
   int info;
   Node next;
}

5.其他类型的动态列表:双向链表和链表头结点。

  • 双向链表:每个节点不仅含有一个指向后一节点的引用,而且还有一个指向前一节点的引用。列表最后节点的next引用为null,第一个节点prev引用也是null。双向链表使得链表节点间向前、向后访问节点更加容易,但建立和修改链表操作将比较复杂。
class Node
{ 
   int Node;
   Node next,prev;
}
  • 链表头节点:在链表中增加一个头结点,该头结点包含了一个指向一个指向链表第一节点的前引用和一个指向最后节点的后引用,后引用以便于在链表尾部插入新节点。
class ListeHeader
{
     int count;
     Node front,rear;
}

注意:头节点与它所引用的Node类不是相同的节点。

6.线性数据结构:队列和堆栈。

  • 队列(queue):队列类似于列表,不同的地方在于队列元素存取方式有限制,队列采取先进先出(FIFO)的存取方式,即类似于生活中我们排队的情况,我们是从队尾入队,队首出队。

  • 堆栈(stack):堆栈类似于队列,不同之处在于元素的存取方式,它是采用后进先出(LIFO)的存取方式,也就是堆栈元素在堆栈的同一端进入和移出栈堆,最后进入的是第一个移出的。

7.非线性数据结构:树和图。

  • 树:由一个根节点和构成层次结构的多个节点组成,除根节点外的所有节点称为内部节点,没有子节点的节点称为叶节点。注意,由下至上地画一棵树,根节点在顶层,叶节点在底层。

    这是一种较为特殊的树结构,它是属于二叉树(binary tree),每个节点不能有超过两个以上的子节点,二叉树应用比较广泛,又被视为一种数据结构。

  • 图:一个图中,一个节点到另一个节点的连接称为边,连接一个图内各节点的边数没有限制。普通图中,边是双向的,即用边相连的两节点A和B,A可以追溯至B,B也可以追溯至A。在一个有向图中,每条边有特定的方向。

8.Java集合类API:Java标准类库中定义了几种不同类型集合的类,称为Java集合类API。
Java集合类API中定义的类定义为泛型,是指一个集合所管理的对象的类型要在实例化时该集合对象时才能确定。泛型保证了集合中对象类型的兼容性。在建立集合时,如果没有指定该集合中可能存放的对象的类型,则将默认定义为Object类型,即该集合可以存放任何类型的对象。


教材学习中的问题和解决过程

  • 问题1:为什么对象特别适合于实现抽象数据类型?

  • 问题1解决方案:参考书上答案,ADT是一个包含数据和施加在这些数据类型上的操作的集合。对象实际上就是将相关变量和相关方法封装在一起的实体。对象隐藏了ADT背后的实现细节,并且将接口和底层的实现相分离,使得实现发生变化后并不影响接口。对象具有良好定义的接口,从而成为一种实现集合的完善机制。

  • 问题2:关于Java集合类API和泛型的内容,书上提到的很少,不能够理解的比较清楚。

  • 问题2解决方案:这里就又参考了之前蓝墨云上的那本书,找到了一些相关的内容,

又参考了一篇博客,其中也有较为详细的解释,

参考链接: Java基础:集合类、泛型

代码调试中的问题和解决过程

  • 问题1:编程项目PP13.3,这里一开始思路的是在在比较完之后进行交换的时候是进行节点的交换,这样调了好久也没有输出,遇到的问题见下图:

  • 问题1解决方案:这个问题卡了好久,换来换去的节点我也不知道是怎么换的了,理了三遍都理不清这个关系了。开始想别的办法,首先想到是对要交换的两个节点都删除,再进行插入,这样可能会解决,但也太麻烦了,不想写插入删除的代码了,最后又看了一遍那个之前的选择排序法才有了思路,我可以直接交换两个节点所指向的数啊,为什么非要换节点,这里想通了以后,就改了几处代码,就解决了,有输出了,但又出现了下面的问题:

    这里是最后一个没参与到排序中去,又看了一遍代码,把外循环中的循还条件的numNode,next!=null改为了numNode!=null,又出现了点小问题,抛出异常:

    最后又把内循环的循环条件由numNode,next!=null改为了numNode!=null,这样就可以进行排序了。

代码托管

上周考试错题总结

  • 1.The following method should return true if the int parameter is even and either positive or 0, and false otherwise. Which set of code should you use to replace ... so that the method works appropriately?
    public boolean question3(int x) { ... }
    A . if (x = = 0) return true;else if (x < 0) return false;else return question3(x - 1);
    B . if (x = = 0) return false;else if (x < 0) return true;else return question3(x - 1);
    C . if (x = = 0) return true;else if (x < 0) return false;else return question3(x - 2);
    D . if (x = = 0) return false;else if (x < 0) return true;else return question3(x - 2);
    E . return(x = = 0);

  • 解析:这道题目的意思是,如何使当x为0和偶数是输出true,如果x为负数和奇数时输出false。我们首先可以设置两个基本情况,第一种x等于0的情况,输出true;x不等于0的情况下,若x<0的情况,则输出false;在x>0的情况下调用递归,我们想如果为偶数,我们让它一直递归减2最终会变为0,而如果是奇数递归减2最终会变为-1,这样符合我们的要求,如果递归减一的话就会是所有的都会最终变为0。

  • 2.What is wrong with the following recursive sum method? The method is supposed to sum up the values between 1 and x (for instance, sum(5) should be 5 + 4 + 3 + 2 + 1 = 15).
    public int sum(int x)
    {
    if (x = = 0) return 0;
    else return sum(x - 1) + x;
    }
    A . the base case should return 1 instead of 0
    B . the recursive case should return sum(x - 1) + 1; instead of sum(x - 1) + x;
    C . the base case condition should be (x <= 0) instead of (x = = 0)
    D . the recursive case should return sum(x) + 1;
    E . the method should return a boolean instead of an int

  • 解析:这个方法并不能对一个负数进行递归相加,如sum(--10),结果是无限递归。我们可以把一个负的参数定义为应该返回0的东西,或者允许一个负的参数来计算一个负数,如:

public int sum(int x)
 {
  if (x = = 0) return 0;

  else if (x < 0) return -1 * sum(-x);

  else return sum(x - 1) + x;
 }
  • 3.What does the following recursive method determine?
    A . returns true if a and b are equal in size, false otherwise
    B . returns true if a is larger than b, false otherwise
    C . returns true if b is larger than a, false otherwise
    D . returns true if a and b have no elements
    E . returns the length of array a + length of array b
public boolean question16(int[ ]a, int[ ] b, int j)
{
 if (j = = a.length) return false;
 else if (j = = b.length) return true;
 else return question16(a, b, j+1);
}
  • 解析:这个程序中的代码代表着如果j=b的长度而不等于a的长度,返回true,其它的均为false。基本情况是如果j等于a的长度,返回false,在j不等于a的情况下,j如果等于b的长度,返回true,j既不等于a的长度,又不等于b的长度,则调用递归计算(a,b,j+1)。这样的结果是只有当a的长度大于b的长度时,才会返回true。

  • 但是这里应该也存在一种无限递归的情况,就是如果一开始j就大于a的长度,又大于b的长度,这个时候不会产生结果。

  • 4.Aside from writing recursive methods, another way that recursion is often used is to define
    A . words in English
    B . mathematical functions
    C . rules and laws
    D . child classes of a parent class in object-oriented programming
    E . recursion is used in all of the above

  • 解析:数学中常常以递归的方式定义函数,这个数学中好像并不常见。

  • 5.The difference between direct and indirect recursion is
    A . direct recursion occurs when a method invokes itself; indirect recursion occurs when there is an intervening method
    B . indirect recursion occurs when a method invokes itself; direct recursion occurs when there is an intervening method
    C . direct recursion only occurs with methods declared to be private; indirect recursion can occur with methods declared to be private, protected, or public
    D . indirect recursion only occurs with methods declared to be private; direct recursion can occur with methods declared to be private, protected, or public
    E . none of the above

  • 解析:直接递归意味着一个方法直接调用自己,而不使用中间方法。当在原始方法再次被调用之前有一个或多个中间方法时,就会发生间接递归。所以这题应该选A项,误选了D项。

  • 6.The recursive method to solve the Towers of Hanoi is usable only if the parameter for the number of disks is 7 or smaller.
    A . true
    B . false

  • 解析:汉诺塔问题可以对任何多个沙盘,不是至多7个。

  • 7.It always is possible to replace a recursion by an iteration and vice versa.
    A . true
    B . false

  • 解析:递归和迭代都是重复的形式。使用递归或迭代的重复是一种风格,品味,有时效率,有时是便利的问题。但它们在计算方面是等价的——每个都可以被另一个取代。

  • 8.The following method correctly multiplies two ints so long as both are non-negative:
    A . true
    B . false

public int mpy(int a, int b)
{
 return (b > 0) ? a + mpy(a, b-1) : 0;
}
  • 解析:这里是说这个方法可以将任意两个非负数相乘,方法中使用了条件运算符,就是当b>0的情况下一直调用递归(a,b-1),到基本情况返回0,这里呢其实是将乘法分成若干次加法进行运算,这里是可以实现对任意两个非负数完成相乘的计算。

结对及互评

点评过的同学博客和代码

  • 本周结对学习情况
    • 20172308

    • 博客中值得学习的或问题:本周博客总结的依旧比较认真,代码问题记录的很详细,参考资料也比较丰富,可适当多些对教材内容总结,错题改正也可适当增加对问题的理解。

    • 结对学习内容
      本周一起学习这本书的最后一章内容——集合,同时还完成了本周的结对实验内容——密码学基础。

其他(感悟、思考等)

感悟

  • 本周的测试结果依然不好,测试时自以为递归一章学的还算是清楚,可测试中做起来感觉自己都是乱的,关于递归那一章可能始终自己有点乱,又重新想了下上章的内容,不知道为什么,测试一直都是做不好,得分不高。本周学习了集合这一章,集合这里做课堂实践时花了一些功夫,关于编程项目PP13.3这里也费了些时间。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 157/157 1/1 15/15
第二周 382/539 1/2 16/31
第三周 317/856 2/4 15/46
第四周 996/1852 1/5 24/70
第五周 578/2330 1/6 16/86 这周对上周第七章的学习有了更深的理解
第六周 475/2805 1/7 14/100 学习了数组方面的相关知识
第七周 629/3434 1/8 14/114 关于继承有一定认识
第八周 1567/5001 3/11 25/141
第九周 428/5429 2/13 17/158 了解了递归内容并学习了IO流相关知识
第十周 893/6322 2/15 16/174 学习集合方面的知识

参考资料

posted @ 2018-05-19 17:36  ◕‿◕  阅读(194)  评论(2编辑  收藏
© 2018 GitHub, Inc.