Рекурсивно перевернуть массив - C (СИ)
Формулировка задачи:
Я могу рекурсивно вывести массив:
А вот как перевернуть его в памяти - не соображу. Вот единственное, что пришло в голову, но хотелось бы решение в стиле функциональных языков, с откусыванием головы. А мое решение - по сути, замаскированный цикл. Я думал как-то выкрутиться через realloc'и, но запутался. К тому же функция желательно чтобы имела сигнатуру int* revR(int* array, int n)
#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;
}#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;
}
Объяснение кода листинга программы
В данном коде рекурсивно переворачивается массив.
- Переменная
Arrуказывает на начало массива, который необходимо перевернуть. - Переменная
nсодержит размер массива. - Если размер массива равен 1, то функция возвращает исходный массив.
- Выделяется память под новый массив
bufразмеромn. - Значение первого элемента исходного массива
Arrприсваивается последнему элементу нового массиваbuf. - Рекурсивный вызов функции
RevArrпроисходит для оставшейся части массиваArr+1размеромn-1. - Выделенный ранее массив
tmpзаполняется значениями элементов, переданных в рекурсивный вызов функцииRevArr. - Для элементов массива
bufотi=0доi=(n-1)происходит копирование значений из массиваtmpв массивbuf. - Выделенная память под массив
tmpосвобождается. - Возвращается массив
buf. - В функции
mainсоздается тестовый массивXразмером 6. - В функции
mainвызывается функцияRevArrс передачей тестового массиваXи его размера 6. - Результат работы функции
RevArrсохраняется в переменнойR. - В цикле от
i=0доi=5происходит вывод значений элементов массиваRчерез пробел. - Выделенная память под массив
Rосвобождается. - Команда
system(PAUSE)приостанавливает выполнение программы до нажатия клавиши. - Программа завершается с возвратом значения 0.