Рекурсивно перевернуть массив - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Я могу рекурсивно вывести массив:
#include <stdio.h>
 
void revR (int* array, int n)
{
    if (n == 0) return;
    revR(array + 1, n - 1);
    printf("%d", *array);
}
 
int main(void)
{
    int arr[] = { 1, 2, 3, 4, 5 };
    revR(arr, 5);
    return 0;
}
А вот как перевернуть его в памяти - не соображу. Вот единственное, что пришло в голову, но хотелось бы решение в стиле функциональных языков, с откусыванием головы. А мое решение - по сути, замаскированный цикл. Я думал как-то выкрутиться через realloc'и, но запутался. К тому же функция желательно чтобы имела сигнатуру int* revR(int* array, int n)
#include <stdio.h>
 
void revR(int* begin, int* end, int n)
{
    if (n > 1)
    {
        int t = *begin;
        *begin = *end;
        *end = t;
        reverse(begin + 1, end - 1, n - 2);
    }
}
 
int main(void)
{
    int arr[] = { 1, 2, 3, 4, 5 };
    reverse(arr, arr + 4, 5);
    for (int i = 0; i < 5; i++) printf("%d ", arr[i]);
    return 0;
}

Решение задачи: «Рекурсивно перевернуть массив»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
 
int * RevArr(int *Arr, int n)
{
    int i;
    int *buf,*tmp;
    if (n==1) return Arr;
    buf=calloc(n,sizeof(int));
    buf[n-1]=Arr[0];
    tmp=RevArr(Arr+1,n-1);
    for (i=0; i< (n-1); i++) buf[i]=tmp[i];
    free(tmp);
    return buf;
}
 
int main(int argc, char *argv[])
{
  int X[6]={1,2,3,4,5,6};
  int *R=RevArr(X,6);
  int i;
  for (i=0; i<6; i++) printf("%d ",R[i]);
  free(R); 
  system("PAUSE");  
  return 0;
}

Объяснение кода листинга программы

В данном коде рекурсивно переворачивается массив.

  1. Переменная Arr указывает на начало массива, который необходимо перевернуть.
  2. Переменная n содержит размер массива.
  3. Если размер массива равен 1, то функция возвращает исходный массив.
  4. Выделяется память под новый массив buf размером n.
  5. Значение первого элемента исходного массива Arr присваивается последнему элементу нового массива buf.
  6. Рекурсивный вызов функции RevArr происходит для оставшейся части массива Arr+1 размером n-1.
  7. Выделенный ранее массив tmp заполняется значениями элементов, переданных в рекурсивный вызов функции RevArr.
  8. Для элементов массива buf от i=0 до i=(n-1) происходит копирование значений из массива tmp в массив buf.
  9. Выделенная память под массив tmp освобождается.
  10. Возвращается массив buf.
  11. В функции main создается тестовый массив X размером 6.
  12. В функции main вызывается функция RevArr с передачей тестового массива X и его размера 6.
  13. Результат работы функции RevArr сохраняется в переменной R.
  14. В цикле от i=0 до i=5 происходит вывод значений элементов массива R через пробел.
  15. Выделенная память под массив R освобождается.
  16. Команда system(PAUSE) приостанавливает выполнение программы до нажатия клавиши.
  17. Программа завершается с возвратом значения 0.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 3.583 из 5
Похожие ответы