Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

Произвольное количество вложенных циклов + рекурсия - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Задана произвольная последовательность, все ли элементы последовательности не равны числу X http://www.cyberforum.ru/cpp-beginners/thread682308.html
Требуется написать программу по данному условию: Задана произвольная последовательность, все ли элементы последовательности не равны числу X. ???
C++ Решение квадратного уравнения методом Уолла Дорогие программисты)) преподователь задал мне программу рабочую, а я не могу найти как её сделать именно методом Уолла , я в панике, помогите пожалуйста ) программирование в среде VS С++ http://www.cyberforum.ru/cpp-beginners/thread682296.html
Позиция самого правого вхождения строки t в строку s C++
Задание: Написать программу, выполняющую заданные действия над строками. Написать программу, которая выдает позицию самого правого вхождения строки t в строку s, или -1, если t не входит в s. - с...
Инициализация конструкторов производного класса C++
Есть два класса class A { int x,y; A(int a, int b): x(a), y(b) { } };
C++ Создание стека без использования классов http://www.cyberforum.ru/cpp-beginners/thread682279.html
На первом шаге нужно создать стек включением в него k целых чисел в возрастающей последовательности. Потом (второй шаг) нужно включить в стек новое целое число так, чтобы не нарушался порядок и...
C++ Посчитать сумму без цикла Здравствуйте! Никак не пойму как можно посчитать сумму(сигма) без использования цикла. Нужно найти сумму (i=0)E(N)=i^3 Здесь нет последовательности. подробнее

Показать сообщение отдельно
comeTrue
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 10

Произвольное количество вложенных циклов + рекурсия - C++

28.10.2012, 11:14. Просмотров 2404. Ответов 8
Метки (Все метки)

Привет.
Нужен код с++, который позволит вывести все комбинации цифр от 1 до k в n-значном числе:
допустим,
ввод n=2, k=3, вывод:

Кликните здесь для просмотра всего текста
1 1
1 2
1 3
2 1
2 2
2 3
3 1
3 2
3 3


ввод 3,3, вывод

Кликните здесь для просмотра всего текста
1 1 1
1 1 2
1 1 3
1 2 1
1 2 2
1 2 3
1 3 1
1 3 2
1 3 3
2 1 1
2 1 2
2 1 3
2 2 1
2 2 2
2 2 3
2 3 1
2 3 2
2 3 3
3 1 1
3 1 2
3 1 3
3 2 1
3 2 2
3 2 3
3 3 1
3 3 2
3 3 3


В интернетах нашел такой вот параграф:

6.5. Произвольное количество вложенных циклов

Разместив рекурсивные вызовы внутри цикла, по сути, получим вложенные циклы, где уровень вложенности равен глубине рекурсии.

Для примера напишем процедуру, печатающую все возможные сочетания из k чисел от 1 до n (). Числа, входящие в каждое сочетание, будем печатать в порядке возрастания. Сочетания из двух чисел (k=2) печатаются так:

Pascal
1
2
3
for i1 := 1 to n do
  for i2 := i1 + 1 to n do
    writeln(i1, ' ', i2);
Сочетания из трех чисел (k=3) так:
Pascal
1
2
3
4
for i1 := 1 to n do
  for i2 := i1 + 1 to n do
    for i3 := i2 + 1 to n do
      writeln(i1, ' ', i2, ' ', i3);
Однако, если количество чисел в сочетании задается переменной, то придется прибегнуть к рекурсии.

Pascal
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
procedure Combinations(
  n, k: integer; 
  //Массив, в котором будем формировать сочетания
  var Indexes: array of integer;
  //Счетчик глубины рекурсии
  d: integer);
var
  i, i_min: integer;
  s: string;
begin
  if d < k then
  begin
    if d = 0 then
      i_min := 1
    else
      i_min := Indexes[d-1] + 1;
    for i := i_min to n do
    begin
      Indexes[d] := i;
      Combinations(n, k, Indexes, d+1);
    end;
  end
  else
  begin
    for i := 0 to k-1 do
      write(Indexes[i], ' ');
    writeln;
  end;
end;
В попытках перевести все на c++ получил:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
using namespace std;
int d=0;
int ind[1000]={0};
 
void comb(int n, int k)
{int i=0,i_min=0;
if (d<k) 
        {if (d==0) i_min=1; else i_min=ind[d-1]+1;
         for (i=i_min; i<n;i++){ind[d]=i; comb(n,k); d++;}}
else {for(i=0;i<n;i++) cout<<ind[i]<<' '; cout<<endl;}}
    
long int main(){
int n,k;
cin>>n>>k;
comb(n,k);
system("pause");
return 0;
}
И кучу ошибок, вплоть до крэша компилятора и необходимости перезапуска(из за переполнения стэка) Помогите найти ошибки или составить новый код.

Обязательно использование рекурсивной функции
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru