2 Вопрос: Обращение массива целых без цикла

вопрос создан в Thu, May 2, 2019 12:00 AM

Я хотел бы написать краткий код, который переворачивает массив целых чисел без использования циклов . Под «обращением» я подразумеваю следующее: [1, 4, 3, 7, 2] -> [2, 7, 3, 4, 1]. Я думаю, что IntStream может быть полезен здесь: должна быть возможность «перехватить» конечный поток и продолжить его, как со стеком (LIFO). К сожалению, я не могу - не могли бы вы помочь?

    
- 1
  1. ПРИМЕЧАНИЕ. IntStream использует цикл. Я думаю, что вы имеете в виду «реверс», и этот тип домашней работы обычно решается с помощью рекурсии. Я предлагаю вам попробовать и задать другой вопрос, если у вас возникнет проблема.
    2019-05-02 15: 23: 32Z
  2. Я исправил возврат к обратному. Под рекурсией вы подразумеваете зацикливание, не так ли? Ну, циклы - это наиболее часто повторяющиеся фрагменты моего кода, поэтому я пытаюсь найти способы их удаления - это так просто. Вышеприведенное упражнение легко выполнить с помощью цикла, но я не могу решить его без него. Жаль, что вы не можете помочь: (
    2019-05-02 15: 29: 56Z
  3. "Под рекурсией вы подразумеваете цикл, не так ли?" Я уверен, что Питер знает разницу.
    2019-05-02 15: 30: 09Z
  4. Нет, рекурсия является очень специфической альтернативой зацикливанию.
    2019-05-02 15: 32: 57Z
  5. Поскольку вы в порядке с IntStream, это это то, что вы хотите?
    2019-05-02 15: 43: 18Z
2 ответа                              2                         

Любой цикл можно заменить рекурсией .

Прокат является примером.

import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.Test;

class RecursionReverseArray {


    private static <T> void reverseImpl(T[] arr,int lhsIdx, int rhsIdx) {
        if(lhsIdx == rhsIdx)
            return;
        T tmp = arr[lhsIdx];
        arr[lhsIdx] = arr[rhsIdx];
        arr[rhsIdx] = tmp;
        reverceImpl(arr, ++lhsIdx, --rhsIdx);
    }

    public static <T> void reverse(T[] arr) {
        reverseImpl(arr, 0, arr.length-1);
    }

    @Test
    void test() {
        Integer[] actual = {9,8,7,6,5,4,3,2,1};
        Integer[] expected = {1,2,3,4,5,6,7,8,9};
        reverse(actual);
        assertArrayEquals(expected, actual);
    }

} 

Как и в Java 8+, вы можете использовать API потока обратных заказов . р>     

1
2019-05-02 16: 20: 14Z
  1. Lol, хороший ответ, но я не мог не заметить ваш интересный выбор идентификаторов.
    2019-05-02 16: 11: 43Z
  2. @ Taslim Oseni left hand side/right hand side? :)
    2019-05-02 16: 17: 27Z
  3. О! Получил это сейчас.
    2019-05-03 01: 13: 43Z

Если вы не хотите использовать циклы, вы можете использовать рекурсии, если хотите. Вот код, написанный с использованием рекурсии.

CODE

импорт java.io. *;

class ReverseArray {

static void rvereseArray(int arr[], int start, int end) 
{ 
    int temp; 
    if (start >= end) 
        return; 
    temp = arr[start]; 
    arr[start] = arr[end]; 
    arr[end] = temp; 
    rvereseArray(arr, start+1, end-1); 
} 

static void printArray(int arr[], int size) 
{ 
    for (int i=0; i < size; i++) 
        System.out.print(arr[i] + " "); 
    System.out.println(""); 
} 

public static void main (String[] args) { 
    int arr[] = {1, 2, 3, 4, 5, 6}; 
    printArray(arr, 6); 
    rvereseArray(arr, 0, 5); 
    System.out.println("Reversed array is "); 
    printArray(arr, 6); 
} 

}

    
0
2019-05-02 15: 54: 57Z
источник размещен Вот