20172302 《程序設計與數據結構》第十週學習總結


2018年學習總結博客總目錄:第一週 第二週 第三週 第四周 第五週 第六週 第七週 第八週 第九周 第十週
html


教材學習內容總結

1.集合是一種對象。從保存類型來看,集合有兩種:同構集合,只能保存類型所有相同的對象;異構集合,能夠保存各類類型的對象。git

2.一個抽象數據類型(ADT)是由數據和在該數據上所實施的操做構成的集合,一個ADT有名稱、值域和一組容許執行的操做。術語「集合」與「抽象數據類型」是能夠互換的等同概念。編程

3.先討論數組和ArrayList類,數組的缺陷在於它必須是要有固定的大小,並且在使用過程當中不能修改;而ArrayList類能夠改變大小,但每次擴大數組時,都是在作建立一個更大的數組並將原數據複製到其中去,這樣會效率很低下,並不高效。這時,咱們引入動態數據結構,它用鏈來實現,利用對象引用做爲鏈接對象間的鏈,就能夠完成各類狀況的數據結構。數組

4.創建動態結構的鏈,見下,實例化兩個Node類對象,並使一個Node對象的引用變量next指向另外一個Node對象,從而將兩個對象連接起來。數據結構

class Node
{
   int info;
   Node next;
}

5.其餘類型的動態列表:雙向鏈表和鏈表頭結點。app

  • 雙向鏈表:每一個節點不只含有一個指向後一節點的引用,並且還有一個指向前一節點的引用。列表最後節點的next引用爲null,第一個節點prev引用也是null。雙向鏈表使得鏈表節點間向前、向後訪問節點更加容易,但創建和修改鏈表操做將比較複雜。
class Node
{ 
   int Node;
   Node next,prev;
}
  • 鏈表頭節點:在鏈表中增長一個頭結點,該頭結點包含了一個指向一個指向鏈表第一節點的前引用和一個指向最後節點的後引用,後引用以便於在鏈表尾部插入新節點。
class ListeHeader
{
     int count;
     Node front,rear;
}

注意:頭節點與它所引用的Node類不是相同的節點。框架

6.線性數據結構:隊列和堆棧。ide

  • 隊列(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 學習集合方面的知識

參考資料

相關文章
相關標籤/搜索