2013-05-08 73 views
0

我在這個考試複習題上是空白的,任何人都可以幫助我入門嗎?在findMinPos中,我對這三個參數感到困惑,我如何訪問數據數組中的節點?即使它是遞歸方法,我可以使用循環嗎?使用遞歸將最小數組的僞代碼轉換爲Java代碼

public class ArraySwapMin 
{ 
    public static void swapMin(int[] data, int cur) 
    { 
     int min = findMinPos(data, cur, cur); 
     ///////////////////////////////////////////////////////////// 
     // swap the min position value with the one in the cur position 
     //////////////////////////////////////////////////////////////// 
    } 
    /** 
    * Check the nodes in "data" from position "start" to the end of the array. 
    * to see if any value in this part of the array is less than the min 
    * value found so far (up to the "cur" position). 
    */ 
    private static int findMinPos(int[] data, int cur, int minPosSoFar) 
    { 
     ////////////////////////////////////////////////////////////// 
     // Compare this entry's value (if it is a valid entry) with the 
     // value in the entry "minPosSoFar". If this value is less, then 
     // this entry is now the "minPosSoFar". 
     // Recurse for the rest of the array. 
     /////////////////////////////////////////////////////////////// 


      return minPosSoFar; 
    } 

    /** 
    * unit tester 
    */ 
    public static void main(String[] args) 
    { 
     int[] data = { 12, 3, 10, 5, 1, 8 }; 

     int count = 0; 
     System.out.println("++++++++++++++++ ArraySwapMin ++++++++++++++++"); 
     printArray("starting array ", data); 

     for (int i = 0; i < data.length - 1; i++) 
     { 
      swapMin(data, i); 
      printArray("swap Min with " + i, data); 
     } 

    } 
    public static void printArray(String label, int[] data) 
    { 
     System.out.print(label + ": [ "); 
     for (int i = 0; i < data.length - 1; i++) 
      System.out.print(data[ i ] + ", "); 
     System.out.println(data[ data.length - 1 ] + " ]"); 
    } 
} 
+1

1 )你已經描述了一個問題,但至今沒有提出問題(更不用說具體的可回答的問題)。你的問題是什麼? 2)請參閱[開始編寫程序](http://home.earthlink.net/~patricia_shanahan/beginner.html)以獲取重要提示。 – 2013-05-08 13:25:24

+0

對不起,我現在編輯 – codeAligned 2013-05-08 13:32:27

回答

1

swapMin()你必須切換當前位置與最小的那個。

public static void swapMin(int[] data, int cur) 
{ 
    int min = findMinPos(data, cur, cur); 

    int minValue = data[min]; 
    data[min] = data[cur]; 
    data[cur] = minValue; 
} 

最小值將在findMinPos()中遞歸確定。 recurseiv編程的整個想法是使用內部方法調用的返回值而不是使用循環。你需要的是一個總體的中斷條件(在你的情況下數組的長度),通常是多個返回語句。

這裏這人會做的伎倆:

private static int findMinPos(int[] data, int cur, int minPosSoFar) 
{ 
    if(cur < data.length) 
    { 
     if(data[cur] < data[minPosSoFar]) // set new minimum to position cur 
     { 
      return findMinPos(data, cur + 1, cur); 
     } 
     else // keep old minimum 
     { 
      return findMinPos(data, cur + 1, minPosSoFar); 
     } 
    } 

    return minPosSoFar; 
} 

而且,由於在多個return語句中的if-else塊使代碼長而雜亂,你可以縮短這樣

private static int findMinPos(int[] data, int cur, int minPosSoFar) 
{ 
    if(cur < data.length) 
    { 
     return (data[cur] < data[minPosSoFar]) ? 
      findMinPos(data, cur + 1, cur) : 
      findMinPos(data, cur + 1, minPosSoFar); 
    } 

    return minPosSoFar; 
} 
1

他們給了你僞代碼。只是做它所說的。首先將說明更改爲分步驟。

  1. 將此條目的值(如果它是有效條目)與條目「minPosSoFar」中的值進行比較。
  2. 如果此值較小,則此條目現在是「minPosSoFar」。
  3. 遞歸陣列的其餘部分。

所以:

private static int findMinPos(int[] data, int cur, int minPosSoFar) 
{ 
    if (cur < data.length) { // Needed for stopping at the end of the array 
    if (data[cur] < data[minPosSoFar]) { // 1. 
     minPosSoFar = cur; // 2. 
    } 
    return findMinPos(data, cur+1, minPosSoFar); // 3. 
    } 
    return minPosSoFar; 
} 

由於這是學校,我不想做這件事對你來說,希望這會給你一個好主意,做什麼。