Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.81/47: Рейтинг темы: голосов - 47, средняя оценка - 4.81
1 / 1 / 0
Регистрация: 14.04.2011
Сообщений: 4

Дано n различных чисел, напечатать все возможные перестановки этих чисел

14.04.2011, 20:31. Показов 9379. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите пожалуйста решить задачу через рекурсию:
Дано n различных чисел, напечатать все возможные перестановки этих чисел.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
14.04.2011, 20:31
Ответы с готовыми решениями:

Дано n различных натуральных чисел (n=5). Напечатать все перестановки этих чисел
Дано n различных натуральных чисел (n=5). Напечатать все перестановки этих чисел.

Рекурсия: дано n различных натуральных чисел (n = 5). Напечатать все перестановки этих чисел
Дано n различных натуральных чисел (n = 5). Напечатать все перестановки этих чисел. Очень нужна помощь

Дано n различных чисел, напечатать все возможные перестановки этих чисел
здраствуйте! пожалуйста помогите решить одну задачу (Дано n различных чисел, напечатать все возможные перестановки этих чисел) на...

13
108 / 108 / 23
Регистрация: 21.03.2010
Сообщений: 445
14.04.2011, 23:22
это ж как определитель матрицы...
0
1 / 1 / 0
Регистрация: 14.04.2011
Сообщений: 4
16.04.2011, 20:55  [ТС]
Что не кто не знает как это сделать ?
Препод просит что бы в задачи был рекурсивный спуск и рекурсивный подъем, а я не представляю как это сделать (
0
108 / 108 / 23
Регистрация: 21.03.2010
Сообщений: 445
16.04.2011, 23:46
ща сделаю.

Добавлено через 1 час 26 минут
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#include<cstdio>
#include<cstdlib>
 
int askNumberOfElements()
{
    int ret;
    do
    {
        printf( "Vvedite k-vo elementov v masive: " );
        scanf_s("%d", &ret);
    }
    while(ret <= 0);
    return ret;
}
int* packArray(int elements)
{
    int* ret = (int*) malloc(elements * sizeof(int));
    for(int i = elements; i; --i)
    {
        printf( "Vvedite %d element massiva: ", elements - i + 1 );
        scanf_s("%d", ret + elements - i);
    }
    return ret;
}
 
bool isContain(int* array, int countOfElements, int requiredElement)
//функция поиска элемента в массиве
{
    for(int i = 0; i < countOfElements; ++i)
        if(array[i] == requiredElement)
            return true;
    return false;
}
void nextElement(int* usedElements, int countOfUsedElements, int& currentElement)
//функция перехода к следующему элементу.
{
    while(isContain(usedElements, countOfUsedElements, ++currentElement)) {   }
}
int firstElement(int* usedElements, int countOfUsedElements)
//Определяет, с какого элемента нацинать итерирование цикла.
{
    int currentElement = 0;
    while(isContain(usedElements, countOfUsedElements, currentElement))
        ++currentElement;
 
    return currentElement;  
}
void recursionPrintAllCombinationOfElemens(int* array, int elements, int countOfUsedElements = 0)
{
    /*
    вообще алгоритм мой тупорыл и состоит в следующем: заводится массив usedElements куда
    записывается номер элемента, который уже был включён в собираемый порядок следования.
    она объявлен как static, это значит что объявлен он будет только первый раз а не при
    каждом рекурсивном вызове функции. Далее если колличество записанных в массив использованных
    элементов не равно количеству элементов выводимого масива то входим в цикл по перебору
    всех неиспользованных элементов, каждый записывается в массив использованных элементов,
    после этого для него вызывается рекурсия.
    если число элементов в массиве использованных элементов равно числу элементов выводимого
    масива, т. е. достиднуто дно рекурсии(или пик, как привычнее) то вызывается цикл по
    выводу элементов исходного массива в соответствии с порядком, указанным в массиве использованных
    элементов. Если ваш препод - толстый троль, он может обратить внимание на то что вывод
    происходит не на этапе выхода из рекурсии а в отдельном цикле. Скажите ему что это вызвано
    спецификой моего алгоритма. и вообще если такой вопрос возникнет, знайте что вопрос этот
    сам по себе тупой, так как для реализации вывода на этапе выхода из рекурсии необходимо,
    так или иначе, вывести все собранные на верхних этажаэ элементы, а для этго всёравно
    нужен отдельный цикл.
    Недостаток алгоритма в том, что заводится дополнительный массив и по нему постоянно идёт
    пойск. Для учебной задачи такой недостаток не так уж и ужасен и кроме того, я пробовал
    гуглить на эту тему и альтернативных решений не нашел. вообще задача решается наилучшим
    образом не с помощью рекурсии а используя циклический подход. что, в целом, логично.
 
    Реализовано всё на чистом си, единственное - не уверен по поводу static. если его ваш
    препод не вытерпет(в нём нет ничего плохого, просто он может выходить за рамки преподаваемого
    материалла) то вынисите объявление usedElements или в глобальное пространство или в main
    */
    static int* usedElements = (int*) malloc(elements * sizeof(int));
    if(countOfUsedElements != elements)
        for(int i = firstElement(usedElements, countOfUsedElements); i < elements; nextElement(usedElements, countOfUsedElements, i))
        {
            usedElements[countOfUsedElements] = i;
            recursionPrintAllCombinationOfElemens(array, elements, countOfUsedElements + 1);
        }
    else
    {
        for(int i = 0; i < elements; ++i)
            printf("%d\t", array[usedElements[i]]);
        printf("\n");
    }
}
 
void main()
{
    int n = askNumberOfElements(),
      * m = packArray(n);
 
    printf("Vse vozmojnie kombinacii elementov:\n");
    recursionPrintAllCombinationOfElemens(m, n);
 
    free(m);
}
1
1 / 1 / 0
Регистрация: 14.04.2011
Сообщений: 4
16.04.2011, 23:58  [ТС]
Спасибо тебе большое, за помощь. Очень благодарен за то что откликнулся.Буду пытаться сдать твой код.
Препод у меня не толстый тролль, а худенькая девушка ))
Ей главное что бы мы научились делать рекурсию, и применили ее к своей задачи(но я от этого далек).
Подскажи пожалуйста где тут рекурсивный спуск и подъем, а то она просит что бы мы пальцем тыкнули и показали ей.
1
108 / 108 / 23
Регистрация: 21.03.2010
Сообщений: 445
17.04.2011, 03:17
когда я учился были углубление в рекурсию и выход из неё. углубление это когда функция вызвала себя а выход это когда вызванная своим верхним экземпляром функция завершила свою работу. Судя по всему получается что спуск это вызов функции, то есть
C
1
recursionPrintAllCombinationOfElemens(array, elements, countOfUsedElements + 1);
а подъёмом можно назвать ту часть функции которая выполняется после того как сработало условие достижения дна рекурсиии. это вывод
C
1
2
3
4
5
6
        else
        {
                for(int i = 0; i < elements; ++i)
                        printf("%d\t", array[usedElements[i]]);
                printf("\n");
        }
и непосредственно завершение работы функций.
0
Заблокирован
17.04.2011, 03:33
Цитата Сообщение от HOBI4EK Посмотреть сообщение
Помогите пожалуйста решить задачу через рекурсию:
Дано n различных чисел, напечатать все возможные перестановки этих чисел.
Рекурсия (во всяком случае в явном виде) никоим боком тут не упёрлась. Правильно эту задачу решать так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <algorithm>
 
int main()
{
    int arr[] = { 1, 2, 3, 4, 5 };
    size_t len = sizeof(arr) / sizeof(int);
 
    do
    {
        for (int i = 0; i < len; i++)
            std::cout << arr[i] << " ";
        std::cout << std::endl;
    } while (std::next_permutation (arr, arr + len));
 
    return 0;
}
Цитата Сообщение от HOBI4EK Посмотреть сообщение
Препод просит что бы в задачи был рекурсивный спуск и рекурсивный подъем, а я не представляю как это сделать (
Печально, что у нас большинство преподов настолько калечные, что не способны придумать адекватные задачи на рекурсию.
1
108 / 108 / 23
Регистрация: 21.03.2010
Сообщений: 445
17.04.2011, 03:49
+3!)))
1
1 / 1 / 0
Регистрация: 14.04.2011
Сообщений: 4
14.05.2011, 13:08  [ТС]
Спасибо большое за помошь, препод сказала что программу можно было сделать в 2 раза меньше.(но вроди притензий по правильности не было)
Кто-нибуть знает как сделать схему стека (просит ее нарисовать).

Добавлено через 6 минут
Точнее: Модель рекурсивного вызова

Добавлено через 4 часа 50 минут
Все спасибо ничего не надо )) Так договорился )
0
0 / 0 / 0
Регистрация: 15.07.2011
Сообщений: 15
29.09.2013, 00:00
Здравствуйте, уважаемые программисты и сисадмины
Просмотрел коды в форуме но ничего касательно с++ не нашел
Пожалуйста помогите
У меня та же задача но нужно обязательно использовать рекурсию
Дано n различных чисел, напечатать все возможные перестановки этих чисел (на С++)
Спасибо заранее
0
0 / 0 / 0
Регистрация: 15.07.2011
Сообщений: 15
05.10.2013, 23:52
Прошу помощи.....
0
108 / 108 / 23
Регистрация: 21.03.2010
Сообщений: 445
06.10.2013, 00:03
так требуется код написанный выше переписать в объектно-ориентированном стиле?
0
0 / 0 / 0
Регистрация: 15.07.2011
Сообщений: 15
06.10.2013, 20:12
Нет, не в Ооп стиле. Структурно на С++ если можно.
И препод просит с рекурсией (((... Просто я пересмотрел выше код и он слишком громоздкий чтоб понять его, а встроенные функции перебора не прокатят... ((
Плизз
0
108 / 108 / 23
Регистрация: 21.03.2010
Сообщений: 445
06.10.2013, 20:16
ну блин. Всё-равно не понимаю. Если это слишком громоздкий, чтобы его понять, то надо бороться с ленью наверно...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.10.2013, 20:16
Помогаю со студенческими работами здесь

Дано n различных натуральных чисел. Напечатать все перестановки этих чисел
Дано n различных натуральных чисел. Напечатать все перестановки этих чисел.

Дано n различных натуральных чисел. Напечатать все перестановки этих чисел
Дано n различных натуральных чисел (например n=5). Напечатать все перестановки этих чисел. питон 2.7 , базовый пакет есть код...

Напечатать все перестановки заданных чисел
Помогите решить задачу Дано n различных натуральных чисел. Напечатать все перестановки этих чисел. Заранее всем спасибо.

Дано n натуральных чисел. Определить все возможные перестановки этих чисел
дано n натуральных чисел. определить все возможные перестановки этих чисел C#

Задан массив попарно различных чисел. Напечатать всё перестановки этих чисел
Задан массив А(1:m)попарно различных чисел.Напечатать всё перестановки этих чисел.


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru