Как рекурсивно реверсировать массив в языке C

В этом руководстве мы хотим рекурсивно закодировать функцию инверсии массива. Получается, что рекурсивный метод сложнее по сравнению с итерационным, но рекурсивная программа более формальна.
Для начала нужно определить случаи рекурсии. Для начала нужно написать программу итерационного метода, чтобы понять.

инвертировать элементы массива в C++

На этом рисунке в три шага объясняется операция перестановки между i и n-i,  Операцию повторяют до тех пор, пока не будет достигнута половина длины картины. Мы должны повторить операцию только с первой половиной массива, иначе мы поменяем местами элементы второй половины с элементами первой половины, которые уже были обработаны, и там мы вернемся к нашему исходному массиву.

Следующий код меняет местами массив с помощью итеративного метода:

#include< conio.h> 
#include< stdio.h>

int main()
{
int i,n,temp;

printf("Размер массива ");
scanf("%d",& n);
int t[n];

for(i=0; Я< n; i++)
{
printf("t[%d]=",i);
scanf("%d",& t[i]);
}
i=0;
while(i< n/2)
{
temp = t[i];
//n-1, потому что массив начинается с 0
t[i]=t[n-1-i];
t[n-1-i]=temp;
i++;
}

printf("\nОбратная таблица: \n");
for(i=0; Я< n; i++)
{
printf("\nt[%d]=%d",i,t[i]);
}
getch();
}
Выполнение этого кода дает:

Инвертировать массив на C с помощью рекурсивного метода

Теперь, когда у нас есть программа для итерационного метода, мы создадим формальную версию. Вы зададитесь вопросом, чем он отличается? Колодец! Рекурсивная версия — это функция, которая вызывает саму себя до тех пор, пока не достигнет точки опоры. Этот рекурсивный вызов эквивалентен циклу в итеративной версии.

Чтобы получить рекурсивную программу, нужно только перевести итеративную программу. Точка опоры — это условие остановки в цикле whilei< n/2 (в программе ставим i>=(n+1)/2 т.к. при вызове функции размер массива n-1 уменьшался). i становится основным параметром функции, так как стоп-тест выполняется после каждого приращения i.

В следующем примере показано, как рекурсивно инвертировать элементы массива в C.

#include< conio.h> 
#include< stdio.h>

int* inverse(int[],int,int);

main()
{
int i,n;
printf("Размер массива");
scanf("%d",& n);
int t[n];
int *ti;
for(i=0; Я< n; i++)
{
printf("t[%d]=",i);
scanf("%d",& t[i]);
}
ti=inverse(t,n-1,0);

printf("\nобратный массив: \n");
for(i=0; Я< n; i++)
{
printf("\nt[%d]=%d",i,ti[i]);
}
getch();
}

int* inverse(int t[],int n, int i)
{
int temp;
if(i>=(n+1)/2 )
return t;
else{
temp = t[i];
t[i]=t[n-i];
t[n-i]=temp;
обратная доходность (t,n,i+1);
}
}
divКомпиляция и выполнение этого кода приводит к следующему: