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