Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
ata
260 / 244 / 186
Регистрация: 28.10.2015
Сообщений: 723
1

Рекурсивно перевернуть массив

11.02.2017, 16:49. Просмотров 765. Ответов 2
Метки нет (Все метки)

Я могу рекурсивно вывести массив:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#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)

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#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;
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.02.2017, 16:49
Ответы с готовыми решениями:

Дан массив размерности n. Заполнить массив случайными числами в диапазоне [-100;100]. Перевернуть массив:
Дан массив размерности n. Заполнить массив случайными числами в диапазоне . Перевернуть массив:...

Перевернуть одномерній массив
«Перевернуть» одномерный массив, состоящий из n вещественных элементов.

Перевернуть массив и, если число элементов массива нечетное, удалить средний элемент
#include &quot;stdafx.h&quot; #include &lt;stdio.h&gt; #include &lt;clocale&gt; #include &lt;math.h&gt; #include &lt;stdlib.h&gt;...

Найти число среди цифр которого есть 2 и 3 и перевернуть его(123=321) (массив) С
Программа считает не верно. Подскажите что надо исправить? int d,i,h=0,b; ...

Нужно "перевернуть" массив (чтобы последний элемент стал первым)
Господа, как перевернуть массив?Чтобы последний элемент стал первым и тд. Запутался в элементах,...

2
Catstail
Модератор
24257 / 12227 / 2204
Регистрация: 12.02.2012
Сообщений: 19,847
11.02.2017, 18:21 2
А чем плохо Ваше решение? На месте, без лишней памяти... Но если хочется, как в ФП, то, к примеру, так:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#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
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
4848 / 2492 / 696
Регистрация: 18.10.2014
Сообщений: 4,326
11.02.2017, 19:06 3
Цитата Сообщение от ata Посмотреть сообщение
А мое решение - по сути, замаскированный цикл.
Ну так рекурсия с единственным рекурсивным вызвовом часто является замаскированным циклом.

Если ваш код не предпринимает никаких неперпремещаемых и сущестувенных для алгорима действий и перед, и после рекурсивного вызова, то получается "головная" или "хвостовая" рекурсия, которая тривиальным и очевидным образом эквивалентна циклу (обратному или прямому соответственно).

Обе ваши функции обладают этим свойством, поэтому мне непонятно, почему во вторым случае вы видите "цикл", а в первом нет.

В вашей функции переворота массива в памяти вы тоже можете выполнить операцию обмена после рекурсивного вызова

C
1
2
3
4
5
6
7
8
9
10
void revR(int* begin, int* end, int n)
{
    if (n > 1)
    {
        reverse(begin + 1, end - 1, n - 2);
        int t = *begin;
        *begin = *end;
        *end = t;
    }
}
Теперь с точки зрения "похожести на цикл" она ничем не отличается от вашего первого варианта.

Непонятно только, зачем в функцию передается и end и n - это дублирующая информация.

Добавлено через 32 минуты
Цитата Сообщение от ata Посмотреть сообщение
хотелось бы решение в стиле функциональных языков
В классические фукциональных языках невозможно решить задачу "перевернуть массив на месте", ибо в фукциональном программировании самой такой постановки задачи не может возникнуть в принципе: "переворот массива на месте" является побочным эффектом, которые в фукциональном программировании запрещены на фундаменальном уровне.
2
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.02.2017, 19:06

Рекурсивно перевернуть список
попробуйте рекурсивно перевернуть список. Для этого напишите функцию recursive_reverse(some_list).

Дан массив целых чисел. Перевернуть массив
дан массив целых чисел. перевернуть массив...

Заполнить рекурсивно массив размером n
Заполнить рекурсивно массив размером n Добавлено через 1 минуту Показать на примере массивов...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru