2013-05-08 48 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; 
} 

由于这是学校,我不想做这件事对你来说,希望这会给你一个好主意,做什么。