13

これを行うための私の機能の特定のニーズを持つものは何も見つかりませんでした、はい、それは宿題のためです。

ので、私は持っています:

public void reverseArray(int[] x) {

}

前提条件:x.length> 0

関数に何も返させず、唯一の引数が配列であるという事実は、私を困惑させています。

再帰と一緒にループを使用してみましたが、試したすべての結果、関数のインスタンスが無限に作成されているようです。

この関数と一緒に別の関数を使用するというアイデア/提案がありますが、元の関数を再帰的に使用する方法は、現時点では私を超えています。

どんな助けでも大歓迎です。

4

13 に答える 13

14
void reverseArray(int[] x){
   reverse(x, 0, x.length -1);
}

void reverse(int[] x, int i, int j){
    if(i<j){//Swap
       int tmp = x[i];
       x[i] = x[j];
       x[j] = tmp;
       reverse(x, ++i, --j);//Recursive
    }   
}

テスト:

int[] s = new int[]{1,2,3,4,5};
reverseArray(s);
System.out.println(Arrays.toString(s));//"5,4,3,2,1"

再帰的、O(n)、一時的な配列は必要ありません。

于 2012-10-31T02:07:54.243 に答える
8

これをコーディングしている場合は、再帰呼び出し用の一時配列を作成し(おそらく、1つの要素を削除しますか?)、関数から戻る前に要素を元の配列にコピーして戻します。また、再帰を終了するための基本ケースを見つける必要があります。

于 2012-10-31T01:56:34.917 に答える
7

これはあなたの宿題なので、私は例を提案します:

与えられたシーケンス:1 2 3 4 5 6 7 8 9 10

次のように変更できます:10 2 3 4 5 6 7 8 9 1

その後:10 9 3 4 5 6 7 8 2 1

....。

ご覧のとおり、段階的に、シーケンスは「より良く」、問題は「より小さく」なります。したがって、完了するために解決する必要がある問題は次のとおりです。

1)このメソッドに再帰呼び出しを適用する方法。オリジナルの場合、メソッドは:reverse(int[] a)。したがって、最初のステップの後、配列を作成する必要がありますb from a[2] --> a[n-1]。そしてreverse(int [] b)`を使用します。

2)逆にした後、逆bにするにはどうすればよいですか?bの値を再びaに割り当てます。

3)停止条件:どのような停止条件ですか?配列bの要素が配列aの要素よりも少ないことがわかります。では、どのステップで停止する必要がありますか?

この助けを願っています:)

于 2012-10-31T02:15:02.857 に答える
2
public class RecursiveArray {


   public static int[] backWardArray(int[] arr, int start, int end) {

       if (start < end) {
           int temp = arr[start];
           arr[start] = arr[end];
           arr[end] = temp;
           backWardArray(arr, start + 1, end - 1);
       }
       return arr;
   }

    public static void main(String[] args) {
        int [] arr = {12,4,6,8,9,2,1,0};
    int [] reversedArray= backWardArray(arr, 0, arr.length-1);
    //loop through the reversed array
        for (int i: reversedArray) {
            System.out.println(i);
        }
    }

    public RecursiveArray() {
    }
}
于 2017-11-19T22:02:26.363 に答える
2

ここでreverseArray(0、n、arr)を呼び出すと、nは配列の長さです。

public void reverseArray(int i, int n, int [] arr)
{
   if(i==n)
   {
     return ;
   } 
   else
   {
     reverseArray(i+1, n, arr);
     System.out.println(arr.at(i));
   }
}
于 2017-12-27T12:52:30.417 に答える
1

以下のように試してください。

public void reverseArray(int[] x) {
    if(x.length ==2){
      //if two elements, swap them
      int first = x[0];
      x[0] = x[1];
      x[1] = first;
    }else if(x.length > 2){
      //swap first and last
      int first = x[0];
      x[0]= x[x.length-1];
      x[x.length-1] = first;
      //create a copy of middle elements
      int [] copy = new int[x.length-2];
      System.arraycopy( x, 1, copy, 0, x.length-2);
      //recursive call for middle elements
      reverseArray(copy);
      //place the reversed elements back in the original array
      System.arraycopy( copy, 0, x, 1, copy.length);
    }
}
于 2012-10-31T02:07:09.110 に答える
0

//ここで操作を実行し、ヘルパーメソッドを呼び出しています。

public void reverseArray(int[] nums){
  int[] hold = new int[nums.length]; //just so it will take this argument
  int[] reversed = recurReverseArray(nums, hold, nums.length - 1, 0);
  nums = reversed; //not returning just changing nums to be reversed.
}
public int[] recurReverseArray(int[] nums, int[] reverse, int end, int start){
  if(end == 0 && start == nums.length - 1){
  reverse[start] = nums[end];
  return reverse; //the way out.
  }
  reverse[start] = nums[end];
  return recurReverseArray(nums, reverse, end - 1, start + 1);
}
于 2015-04-12T17:47:24.303 に答える
0

主な方法は次のとおりです。

package main;

public class Main {
    public static void main(String[] args) {
        StringOps ops = new StringOps();
        String string = "Arjun";
        // reversing the string recrusively
        System.out.println(ops.reverseRecursively(string.toCharArray(), 0));
    }
}

そしてここに再帰関数があります:

package main;

public class StringOps {
    public char[] reverseRecursively(char[] array, int i) {
        char[] empty = new char[0];
        if (array.length < 1) {
            System.out.println("you entered empty string");
            return empty;
        }
        char temp;
        temp = array[i];
        array[i] = array[array.length - 1 - i];
        array[array.length - 1 - i] = temp;
        i++;

        if (i >= array.length - 1 - i) {
            return array;
        } else {
            reverseRecursively(array, i);
            return array;
        }

    }

}
于 2015-11-26T06:49:23.110 に答える
0
public class FunWithAlgorthims {


public static void main(final String[] args) {

    String[] array = {"a", "b", "c", "d"};
    printArray(array);
    revereArrayRecusrive(array, 0);
    printArray(array);
}


public static void revereArrayRecusrive(final String[] array, int startPointer) {
    if (startPointer >= (array.length / 2)) {
        return;
    }
    String temp = array[startPointer];
    array[startPointer] = array[array.length - 1 - startPointer];
    array[array.length - 1 - startPointer] = temp;
    revereArrayRecusrive(array, ++startPointer);
}

public static void printArray(final String[] array) {
    Arrays.stream(array).forEach(a -> System.out.print(a + " "));
    System.out.println();
}

}

于 2016-10-13T21:18:58.900 に答える
0

これはおそらく最も簡単な方法であり、最速ではありませんが、おそらく最も簡単です。

プログラム全体は次のようになります。

public static void main(String [] args)
{
    BackwardsArray back = new BackwardsArray();
}

public BackwardsArray()
{
    int [] a = {1,2,3,4,5,6,7,8,9};
    printBackwards(a);
}

void printBackwards( int [] b)
{
    print(b,b.length-1);
}

void print(int [] b, int pos)
{
    System.out.println(b[pos]); // prints last item
    if(pos != 0)
    {
        print(b,pos-1);
    }
}

それが役に立てば幸い!

于 2017-09-26T22:32:09.027 に答える
0
private static void reversePrint(int[] numbers)
{
    if(numbers.length==0) {
        return;
    }
    int[] a = new int[numbers.length -1];
    for(int i =0;i<numbers.length-1;i++) {
        a[i] = numbers[i+1];
    }
    reversePrint(a);
    System.out.println(numbers[0]+" ");

}
于 2019-08-30T13:25:31.117 に答える
-1

ループを使用できないというステートメントがないため、次のようになります。

void reverseArray(int[] x) {
    if (x != null) {
        for (int i = 0; i < length.x / 2; i++) {
            int j = (length.x - 1) - i;
            int temp = x[i];
            x[i] = x[j];
            x[j] = temp;
         }
         reverseArray(null);
     }
}

おそらくロットの中で最速です。

于 2012-10-31T02:25:41.977 に答える
-1

疑似コード

function revarray(a[1...n])
  if a.length == 1 or a.length == 0
    do nothing 
  # return a
  else
     swap a[1] and a[n]
     revarray(a[2...n-1])
  # return a (The function will not return anything but the contents of a are changed)
于 2012-10-31T01:51:58.560 に答える