Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.76/63: Рейтинг темы: голосов - 63, средняя оценка - 4.76
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
1

Сортировка выбором. Рекурсия

08.08.2010, 02:47. Показов 11776. Ответов 26
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Дичайше туплю... Нужна сортировка выборкой одномерного массива. Рекурсией. Итерацией могу сделать. Рекурсией - никак... Застопорило что-то. Буду благодарен за подсказку и помощь.

Добавлено через 6 минут
Вот обычная сортировка выбором с помощью итераций...

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
#include <iostream>
#include <ctime>
 
void selectionSort(int Arr[], int size); 
 
int main()
{
    srand(time(NULL));
    const int Size=10;
    int Arr[Size];
    for(int i=0;i<Size;++i)
        Arr[i]=1+rand()%100-1+1;
    std::cout<<"Arr is:\n";
    for(int i=0;i<Size;++i)
    {
        std::cout<<Arr[i]<<' ';
    }
    std::cout<<std::endl;
    selectionSort(Arr, Size);
    return 0;
}
 
void selectionSort(int Arr[], int size)
{
    int k=0, x=0;
    for(int i=0; i < size; i++) 
    { 
        k=i; x=Arr[i];
        for(int j=i+1; j < size; j++) 
        if (Arr[j] < x) 
        {
            k=j; x=Arr[j]; 
        }
        Arr[k] = Arr[i]; 
        Arr[i] = x;
    }
    std::cout<<"Sorted array:\n";
    for(int i=0;i<size;++i)
        std::cout<< Arr[i] <<' ';
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.08.2010, 02:47
Ответы с готовыми решениями:

Сортировка выбором
Разбираю сортировку выбором. Как реализовать сортировку по возрастанию понял, а как реализовать...

Сортировка выбором
Помогите тут сделать сортировку выбором for (i = 0; i&lt;n; i++) { for (j = 0; j&lt;n; j++) {...

Сортировка выбором
Что не так с сортировкой простого выбора????((( #include &lt;iostream&gt; using namespace std; ...

Сортировка выбором
#include &lt;iostream&gt; #include &lt;math.h&gt; #include &lt;conio.h&gt; #include &lt;cstdlib&gt; using namespace...

26
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
08.08.2010, 03:22 2
ну вот какую-то рекурсию присобачил
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void sort(int * a, int n)
{
   int t = 0;
   for(int i = 0; i < n; ++i)
   {
      if(a[i] < a[t])
         t = i;
   }
 
   std::swap(a[t], a[0]);
 
   if(n > 1)
      sort(a + 1, n - 1);   
      
   return;
}
Добавлено через 7 минут
Цитата Сообщение от Lavroff Посмотреть сообщение
Итерацией могу сделать. Рекурсией - никак
вообще рекурсия в принципе просто из итераций делается. просто берешь и цикл заменяешь условием, если условие выполняется, то вызываешь следующую рекурсию, если нет - возвращаешься из функции. смысл то тот же.
если хочешь можно тебе задачек еще на рекурсию напридумывать
1
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
08.08.2010, 03:23  [ТС] 3
fasked, Спасибо. Работает...
А про задачки... Я только за.

Не по теме:

Что-то со мной случилось в последнее время. Ничего сделать не могу. Даже элементарного... Не знаешь в чем может быть дело?

0
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
08.08.2010, 03:30 4
Цитата Сообщение от Lavroff Посмотреть сообщение
Что-то со мной случилось в последнее время. Ничего сделать не могу. Даже элементарного...
ну тогда давай начнем с самого элементарного
найти сумму элементов массива рекурсивно.
да, и в нагрузку. пиши сразу тест к своей программе. например есть же в STL алгоритм, который тоже находит сумму элементов массива. вот ты и сравнивай результаты своей функции и STL'вского алгоритма. В результате на экране должна быть информация вида "true/false".
1
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
08.08.2010, 03:53  [ТС] 5
Больше всего времени ушло на поиск того как включить accumulate...

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
#include <iostream>
#include <ctime>
#include <numeric>
 
int Sum_of_el(int Arr[], int size);
 
int main()
{
    srand(time(NULL));
    const int Size=10;
    int Arr[Size];
    for(int i=0;i<Size;++i)
        Arr[i]=1+rand()%10-1+1;
    for(int i=0;i<Size;++i)
        std::cout<< Arr[i] <<' ';
    std::cout<<std::endl;
    int Sum=0;
    int AlgSum=0;
    Sum=Sum_of_el(Arr, Size);
    std::cout<< Sum <<'\n';
    AlgSum=std::accumulate(Arr, Arr+Size, AlgSum);
    std::cout<< AlgSum <<'\n';
    if(Sum==AlgSum)
        std::cout<<std::boolalpha<<true<<'\n';
    else
        std::cout<<std::boolalpha<<false<<'\n';
        return 0;
}
 
int Sum_of_el(int Arr[], int size)
{
    static int Sum=0;
    int i=size-1;
    if(i<0)
        return Sum;
    Sum+=Arr[i];
    return Sum_of_el(Arr, size-1);
}
0
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
08.08.2010, 03:58 6
Цитата Сообщение от Lavroff Посмотреть сообщение
Больше всего времени ушло на поиск того как включить accumulate...
тоже полезно, а вот статическими переменными пользоваться нечестно!
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
08.08.2010, 04:00  [ТС] 7
Окей. Резалт аналогичный

C++
1
2
3
4
5
6
7
8
9
int Sum_of_el(int Arr[], int size)
{
    int Sum=0;
    int i=size-1;
    if(i<0)
        return Sum;
    Sum+=Arr[i];
    return Sum+Sum_of_el(Arr, size-1);
}
0
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
08.08.2010, 04:04 8
Цитата Сообщение от Lavroff Посмотреть сообщение
Окей. Резалт аналогичный
return все же эстетичнее будет в конец вставлять. хотя это мои личные предпочтения, просто люблю, чтобы выход был в конце текста функции, а не посередь.

так. я спать пожалуй спать пойду, а чтобы ты не скучал пока. вот. рекурсивно реализовать функцию аккермана
1
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
08.08.2010, 04:21  [ТС] 9
Короче и красивше.

C++
1
2
3
4
5
6
7
8
9
int Sum_of_el(int Arr[], int size)
{
    int Sum=0;
    Sum+=*Arr;
    if(size==1)
        return Sum;
    else
        return Sum+Sum_of_el(Arr+1, size-1);
}
Добавлено через 12 минут
Аккер:

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
#include <iostream>
 
typedef unsigned long long U_LL;
 
U_LL Akker(U_LL n, U_LL m);
 
int main()
{
    U_LL n, m;
    std::cout<<"Enter first numb: ";
    std::cin>>m;
    std::cout<<"Enter second numb: ";
    std::cin>>n;
    std::cout <<Akker(m, n);
    return 0;
}
 
U_LL Akker(U_LL m, U_LL n)
{
    if(m==0)
        return n+1;
    else if(m>0&&n==0)
        return Akker(m-1, 1);
    else if(m>0&&n>0)
        return Akker(m-1, Akker(m, n-1));
}
0
Заблокирован
08.08.2010, 04:35 10
Позволю себе вякнуть, что рекурсия тут нафик не нужна, ибо во-первых будет медленее работать, а во-вторых всегда есть возможность словить stack overflow.
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
08.08.2010, 04:35  [ТС] 11
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
#include <iostream>
 
typedef unsigned long long U_LL;
 
U_LL Akker(U_LL n, U_LL m);
 
int main()
{
    U_LL n, m;
    std::cout<<"Enter first numb: ";
    std::cin>>m;
    std::cout<<"Enter second numb: ";
    std::cin>>n;
    std::cout <<Akker(m, n);
    return 0;
}
 
U_LL Akker(U_LL m, U_LL n)
{
    if(m==0)
        return n+1;
    else if(n==0)
        return Akker(m-1, 1);
    return Akker(m-1, Akker(m, n-1));
}
1
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
08.08.2010, 04:37 12
следующая. вычислить определитель квадратной матрицы рекурсивно.

Добавлено через 1 минуту
Цитата Сообщение от NightmareZ Посмотреть сообщение
Позволю себе вякнуть, что рекурсия тут нафик не нужна, ибо во-первых будет медленее работать, а во-вторых всегда есть возможность словить stack overflow.
можете, но задачи решаются специально рекурсивными методами
0
ForEveR
08.08.2010, 04:38  [ТС]
  #13

Не по теме:

fasked, Ты убийца) Чувствую с этим я просижу дольше

0
Заблокирован
08.08.2010, 04:39 14
Цитата Сообщение от fasked Посмотреть сообщение
можете, но задачи решаются специально рекурсивными методами
Всмысле специально?
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12458 / 7482 / 1753
Регистрация: 25.07.2009
Сообщений: 13,762
08.08.2010, 04:43 15
Цитата Сообщение от Lavroff Посмотреть сообщение
Короче и красивше.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
 
int sum(int * arr, int cnt){
    return ( cnt == 1 ) ? *arr : *arr + sum(arr + 1, cnt - 1);
}
 
int main(void){
    int arr[] = { 1, 2, 3, 4, 5 };
    
    printf("1 + 2 + 3 + 4 + 5 = %d\n", sum(arr, sizeof(arr) / sizeof(*arr)));
 
    return 0;
}
1
ForEveR
08.08.2010, 05:52  [ТС]
  #16

Не по теме:

fasked, Про определитель. Это уже завтра... Если вообще смогу. Вспомнилась алгебра и моя не слишком большая любовь к определителям.

0
Мат в 32 хода
237 / 172 / 18
Регистрация: 10.09.2009
Сообщений: 1,096
08.08.2010, 09:35 17
Не короче, не красивше, но зато моё!!!!
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
using namespace std;
int sum(int arr[], int size)
{
    if(size==0) return arr[0];
    else {return (arr[size]+sum(arr, size-1)); size--;};
}
int main()
{
    int a[10];
    for(int i=0;i<10;i++)
        cin>>a[i];
    cout<<sum(a,9)<<"\n";
    system("pause");
}
Добавлено через 6 минут
Вот, "подкрасил".
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
int sum(int arr[], int size)
{
    if(size==0)  return arr[0];
    else return arr[size]+sum(arr, --size);
}
int main()
{
    int a[10]={1,2,3,4,5,6,7,8,9,10}
    std::cout<<sum(a,9)<<"\n";
    system("pause");
    return 0;
}
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
09.08.2010, 01:36  [ТС] 18
Определитель. Для 3 правильно считает. Дальше не проверял. 20 тужился тужился не посчитал. Или просто я не дождался.
Совсем сам сделать не смог. Пришлось посмотреть на другие программы, понять модель и сделать вот так.

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
#include <iostream>
#include <cmath>
#include <ctime>
 
double determ(int** Arr, int size);
 
int main()
{
    srand(time(NULL));
    int size=3;
    int**Arr;
    Arr=new int*[size];
    for(int i=0;i<size;++i)
        Arr[i]=new int[size];
    for(int i=0;i<size;++i)
        for(int j=0;j<size;++j)
            Arr[i][j]=0+rand()%5-1+1;
    for(int i=0;i<size;++i)
    {
        for(int j=0;j<size;++j)
            std::cout<<Arr[i][j]<<' ';
        std::cout<<std::endl;
    }
    std::cout<< determ(Arr, size) <<'\n';
    for(int i=0;i<size;++i)
        delete[] Arr[i];
    delete[] Arr;
    return 0;
}
 
double determ(int** Arr, int size)
{
    int i,j;
    double det=0;
    int** matr;
    if(size==1)
    {
        det=Arr[0][0];
    }
    else if(size==2)
    {
        det=Arr[0][0]*Arr[1][1]-Arr[0][1]*Arr[1][0];
    }
    else
    {
        matr=new int*[size-1];
        for(i=0;i<size;++i)
        {
            for(j=0;j<size-1;++j)
            {
                if(j<i) 
                    matr[j]=Arr[j];
                else
                    matr[j]=Arr[j+1];
            }
            det+=pow((double)-1, (i+j))*determ(matr, size-1)*Arr[i][size-1];
        }
        delete[] matr;
    }
    return det;
}
0
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
09.08.2010, 01:38 19
Цитата Сообщение от Lavroff Посмотреть сообщение
Определитель. Для 3 правильно считает. Дальше не проверял. 20 тужился тужился не посчитал. Или просто я не дождался.
Совсем сам сделать не смог. Пришлось посмотреть на другие программы, понять модель и сделать вот так.
Проверять не буду, но на первый взгляд правильная. Точки останова вижу в 1 и в 2. Новая матрица создается. Зачтено
1
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
09.08.2010, 01:42  [ТС] 20
fasked, Продолжение будет?) Только желательно без вышки) Скоро итак учеба уже)
0
09.08.2010, 01:42
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.08.2010, 01:42
Помогаю со студенческими работами здесь

Сортировка выбором
Здравствуйте товарищи. Есть к вам одни вопрос. Есть задание- . Дана целочисленная квадратная...

Сортировка выбором
#include &quot;stdafx.h&quot; #include&quot;iostream&quot; #include&quot;time.h&quot; using namespace std; int main()...

сортировка выбором
помогите пожалуйста, алгоритм не работает то есть не сортирует #ifndef FUNC #define FUNC...

Сортировка выбором
Информатика 1 курс, прошу помочь с написанием кода программы: Сортировка выбором. Выбирается...

Сортировка выбором
Привет. Готовлюсь к собеседованиям и решил подтянуть все сортировки. Помню весной решал такую...

Сортировка выбором
Обьясните вот эту строчку min = ( a &lt; a ) ? j : min; #include &lt;iostream&gt; using namespace std;...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru