Рекурсивно перевернуть массив - 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.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д