0

この試験の復習問題に答えていません。始めるのを手伝ってくれる人はいますか? findMinPos で、3 つのパラメーターに混乱しています。データ配列のノードにアクセスするにはどうすればよいですか? 再帰的な方法ですが、ループを使用できますか?

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 ] + " ]" );
    }
}
4

2 に答える 2

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 プログラミングの全体的な考え方は、ループを使用する代わりに内部メソッド呼び出しの戻り値を使用することです。必要なのは、全体的なブレーク条件 (この場合は配列の長さ) と、通常は複数の return ステートメントです。

これはここでトリックを行います:

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;
}

そして、if-else ブロック内の複数の return ステートメントにより、コードが長く乱雑になるため、次のように短くすることができます。

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;
}
于 2013-05-08T14:05:57.910 に答える
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;
}

これは学校のためのものなので、私はあなたのためにすべてをやりたいとは思いません。

于 2013-05-08T13:49:59.757 に答える