Java, рекурсивно обратный массив
Я ничего не нашел с конкретными потребностями моей функции, чтобы сделать это, да, это для домашней работы.
Итак, у меня есть:
public void reverseArray(int[] x) {
}
Условие: x.length > 0
Тот факт, что у меня не может быть функция, возвращает что-либо, и единственным аргументом является массив, оставляющий меня в тупике.
Я пробовал использовать циклы вместе с рекурсией, но все, что я пробовал, похоже, заканчивается бесконечными экземплярами выполняемой функции.
У меня возникла идея/предложение использовать другую функцию вместе с этим, но, как использовать исходный рекурсивно, вы находитесь за пределами меня на данный момент.
Любая помощь приветствуется.
Ответы
Ответ 1
Если бы я кодировал это, я бы создал временный массив (возможно, с удалением одного элемента?) для рекурсивного вызова и копирования элементов обратно в исходный массив, прежде чем вернуться из функции. Вам также нужно будет найти базовый регистр для завершения рекурсии.
Ответ 2
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), не требуется временный массив.
Ответ 3
Поскольку это ваша домашняя работа, я предлагаю пример:
Данная последовательность: 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 еще раз для.
3) условие остановки: какое условие остановки? Вы видите, что элементы массива b меньше элементов массива a. Итак, на какой шаг мы должны остановиться?
Надеюсь, что эта помощь:)
Ответ 4
Попробуйте что-то, как показано ниже:
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);
}
}
Ответ 5
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() {
}
}
Ответ 6
Вызов 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));
}
}
Ответ 7
//Мы просто выполняем операцию здесь и вызываем вспомогательный метод.
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);
}
Ответ 8
Вот основной способ:
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;
}
}
}
Ответ 9
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();
}
}
Ответ 10
Это, наверное, самый простой способ, а не самый быстрый, но, возможно, самый легкий.
Вся программа будет выглядеть примерно так:
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);
}
}
Надеюсь, что это поможет!
Ответ 11
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]+" ");
}
Ответ 12
psuedo code
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)
Ответ 13
Так как не было указаний о том, что циклы не могут использоваться:
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);
}
}
Вероятно, самый быстрый из лота.