Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
Best_Coder
0 / 0 / 0
Регистрация: 18.09.2014
Сообщений: 81
1

Алгоритм рекурсивной процедуры

11.10.2014, 15:35. Просмотров 1001. Ответов 3
Метки нет (Все метки)

Нужен простенький алгоритм для рекурсивной процедуры перебора вариантов.
Задача такая,например n==3; k==2;

Вывод 222 221 212 211 122 121 112 111
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.10.2014, 15:35
Ответы с готовыми решениями:

Алгоритм рекурсивной процедуры генерации перестановок чисел
Нужен простенький алгоритм алгоритм рекурсивной процедуры генерации перестановок чисел от 1 до n......

Как запрограммировать в рекурсивной форме алгоритм бинарного поиска
Помогите пожалуйста!!! Как запрограммировать в рекурсивной форме алгоритм бинарного поиска

Написать функции рекурсивной и не рекурсивной реализации алгоритма Евклида нахождения наибольшего общего делителя (НОД) двух натуральных чисел
Написать функции рекурсивной и не рекурсивной реализации алгоритма Евклида нахождения...

Алгоритм процедуры интерполяции
Очень нужна помощь с написанием кода. Задание: разработать алгоритм процедуры интерполяции...

Нужен алгоритм поиска пути в этом лабиринте (будь то волновой алгоритм или алгоритм правой/левой руки )
#include "stdafx.h" #include <iostream> #include <conio.h> using namespace std; void lab...

3
D-mon55
4 / 4 / 4
Регистрация: 15.07.2014
Сообщений: 28
11.10.2014, 19:48 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
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
#include <cmath>
#include <iostream>
 
long long Combination(char **, unsigned int, unsigned int, int[], int, const char[], int);
int * DigitUp(int *, int, int);
 
int _tmain(int argc, _TCHAR* argv[])
{
 
 
    char alphabet[] = "0123456789ABCDF";
 
    unsigned int n = 6; // length
    unsigned int k = 3; // capacity
 
    unsigned int capacity = std::pow(k, n);
 
    char ** output = new char*[capacity];
    for (unsigned i = 0; i < capacity; ++i)
        output[i] = new char[n];
 
    int * digit = new int[n];
    for (unsigned int i = 0; i < n; i++)
        digit[i] = 0;
 
    Combination(output, capacity, 0, digit, n,alphabet,k);
 
///////////////
    std::cout << std::endl; 
    for (unsigned int i = 0; i < capacity; i++)
        for (unsigned int j = 0; j < n; j++)
        {
        if (j % n == 0)
            std::cout << std::endl;
        std::cout << output[i][j];
        }
    std::cout << std::endl;
//////////////  
 
    for (unsigned i = 0; i < capacity; ++i)
        delete [] output[i];
    delete output;
    delete digit;
    
 
    std::cin.get();
    std::cin.get();
    return 0;
}
 
 
 
long long
Combination(char ** out, unsigned int capacity, unsigned int nCount, int digit[], int nSizeDigit, const char * alphabet, int nSizeAlphabet) {
    if (nCount >= capacity) return nCount;
 
    int * bit = digit;
    for (int i = 0; i < nSizeDigit ; i++, bit++)
        out[nCount][i] = alphabet[*bit];
    DigitUp(digit, nSizeDigit - 1, nSizeAlphabet);
    return Combination(out, capacity, ++nCount, digit, nSizeDigit, alphabet, nSizeAlphabet);
    
}
 
int * 
DigitUp(int * digit, int power, int capacity) {
    digit[power]++;
    for (int i = power; i >= 0; i--) {
        if (digit[i] < capacity) break;
        if (i == 0)  break;
 
        digit[i] = 0;           
        digit[i - 1]++;
    }
        
    return digit;
}

Да,учти, стек не резиновый.
1
Best_Coder
0 / 0 / 0
Регистрация: 18.09.2014
Сообщений: 81
11.10.2014, 20:07  [ТС] 3
Спасибо, Димон, ща пойду изучать
0
D_in_practice
334 / 334 / 331
Регистрация: 02.10.2014
Сообщений: 666
11.10.2014, 21:27 4
Лучший ответ Сообщение было отмечено Best_Coder как решение

Решение

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
#include <iostream>
#include <cmath>
 
using namespace std;
 
void f(int k,int n,int &i);
 
int main(){
    
    int k = 3, n = 4, i = 0;
    
    f(k, n, i);
    
    return 0;
}
 
void f(int k, int n, int &i){
 
    int l;
    
    if (pow(k, n) != i){
        for (int j = n - 1; j >=0; --j){
            l = i / pow(k, j);
            cout << (l % k + 1);
        }       
        cout <<  endl;
        ++i;
        f(k, n, i);
    }   
}
1
11.10.2014, 21:27
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.10.2014, 21:27

Остановка рекурсивной процедуры
Каким образом можно прервать выполнение такой рекурсивной процедуры? Написал процедуру, которая...

Ограничение количества вариантов рекурсивной процедуры
Добрый день! Каким образом можно ограничить количество вариантов, перебираемых в рекурсивной...

Создание рекурсивной процедуры на примере вычисления факториала
Создание рекурсивной процедуры на примере вычисления факториала Шаг 1. Создайте приложение Windows...


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

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

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