Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.10.2016, 18:51   #1
Вероника99
Форумчанин
 
Регистрация: 15.12.2013
Сообщений: 414
По умолчанию Из рекурсии в итерацию

Здравствуйте. Помогите разобраться как в следующей программе сделать вместо рекурсивной функции - итерационную. Программа выводит последовательности длинно k, полученные с чисел 1,2 ...n.
Код:
int n, k;
bool mas[200];
 
 
void func(int lst, int cnt)
{
    if(cnt == k) 
    {
        for(int i = 0; i <n; i++) 
        {
            if(mas[i])
            {
                cout << i+1 << " ";
            }
        }
        cout << endl;
        return;
    }
 
    if(lst + 1 >= n) 
    {
        return;
    }
 
    mas[lst + 1] = true;
    func(lst + 1, cnt + 1);
 
    mas[lst + 1] = false;
    func(lst + 1, cnt);
    return;
}
Как параметры в рекурсию передаются func(-1, 0);
Спасибо
Вероника99 вне форума Ответить с цитированием
Старый 02.10.2016, 22:08   #2
GreenWizard
мальчик-помогай =)
Форумчанин
 
Регистрация: 16.09.2010
Сообщений: 522
По умолчанию

скинь исходную задачу т. к. код такой, что.... кхм... у меня вон проект на 20+ solutions и то проще понять
если же тебе оно реально нужно, а не лишь бы сдать, то попробуй написать рекурсивную версию проще, а потом на иттеративную перенесёшь.
GreenWizard вне форума Ответить с цитированием
Старый 03.10.2016, 18:07   #3
Вероника99
Форумчанин
 
Регистрация: 15.12.2013
Сообщений: 414
По умолчанию

Это сочетания (Сочетаниями из n элементов по k называются соединения, которые можно образовать из n элементов, собирая в каждое соединение k элементов; ). Результат на скрине. Вроде как должны быть циклы:
Код:
for (int i = 1; i <= n-k+1; i++) {
    for (int j = 0; j < k; j++) {
        cout <<i+j <<" ";
    }
    cout <<"\n";
}
Но нужно добавить условия проверки, я по этой рекурсии я не понимаю,как их внедрить в итерацию.
Изображения
Тип файла: jpg 2.JPG (10.5 Кб, 70 просмотров)
Вероника99 вне форума Ответить с цитированием
Старый 04.10.2016, 09:06   #4
Вероника99
Форумчанин
 
Регистрация: 15.12.2013
Сообщений: 414
По умолчанию

Не подскажите?
Вероника99 вне форума Ответить с цитированием
Старый 04.10.2016, 10:04   #5
GreenWizard
мальчик-помогай =)
Форумчанин
 
Регистрация: 16.09.2010
Сообщений: 522
По умолчанию

Тут не программирование, а математика, ещё и мутная..... всем лень)
Сейчас загуглил "вывод сочетаний код" и нашёл, например, весьма хороший сборник по комбинаторике... почитай, там твоя задача, вроде, есть
GreenWizard вне форума Ответить с цитированием
Старый 04.10.2016, 11:00   #6
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,527
По умолчанию

http://programmersforum.ru/showthrea...F0%E5%E1%EE%F0
Это не С, и не совсем число сочетаний (нет требования различности элементов).
Но перебор и с помощью циклов (итераций).
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 04.10.2016, 14:33   #7
Вероника99
Форумчанин
 
Регистрация: 15.12.2013
Сообщений: 414
По умолчанию

Цитата:
Сообщение от Вероника99 Посмотреть сообщение

mas[lst + 1] = true;
func(lst + 1, cnt + 1);

mas[lst + 1] = false;
func(lst + 1, cnt);

}
[/CODE]
Проблема в том,что я не понимаю принцип этой рекурсии, а именно строки,
которые я выделила. Что это может значить? mas[lst + 1] присваивается истина, потом вызывается функция func(lst + 1, cnt + 1);, а при каких услових вызывается func(lst + 1, cnt);. Вообще не понимаю
Вероника99 вне форума Ответить с цитированием
Старый 04.10.2016, 14:56   #8
GreenWizard
мальчик-помогай =)
Форумчанин
 
Регистрация: 16.09.2010
Сообщений: 522
По умолчанию

Цитата:
Сообщение от Вероника99 Посмотреть сообщение
Проблема в том,что я не понимаю принцип этой рекурсии, а именно строки,
которые я выделила. Что это может значить? mas[lst + 1] присваивается истина, потом вызывается функция func(lst + 1, cnt + 1);, а при каких услових вызывается func(lst + 1, cnt);. Вообще не понимаю
Пардон за мой французский, но говно это редкостное.... думал это ты написала, поэтому предложил переписать более вменяемо.
Смысл в том что при func(lst + 1, cnt + 1) у нас mas[lst + 1] = true, а в др. случаях - false.... оно, конечно, смысл имеет, это часть того самого префикса, пусть и в скрытом виде, НО лучше забить и написать\найти иттеративный вариант с нуля
GreenWizard вне форума Ответить с цитированием
Старый 04.10.2016, 15:23   #9
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,527
По умолчанию

mas[] массив признаков использования чисел [0... n-1] +1 для генерации (вывода) последовательности
Цитата:
Код:
 if(mas[i]) 
            {
                cout << i+1 << " ";
lst подставляемое число 0..n
мы всегда имеем ДВА варианта (использовать/неиспользовать) данное число

mas[lst + 1] = true;
func(lst + 1, cnt + 1); // выполнить "спуск" с УВЕЛИЧЕНИЕМ (cnt+1) числа использованных чисел

mas[lst + 1] = false;
func(lst + 1, cnt ); // выполнить "спуск" БЕЗ увеличения (cnt) числа использованных

Код:
    if(cnt == k)  //МЫ набрали нужное нам количество чисел для вывода 

    if(lst + 1 >= n)  // МЫ перебрали ВСЕ допустимые числа
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 04.10.2016 в 15:37.
evg_m вне форума Ответить с цитированием
Старый 04.10.2016, 23:37   #10
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

Обычно в рекурсии используется один вызов функции. Но два...

Ну, попробуй нарисовать "всю работу программы" - может что-то прояснится. Типа такого (красный цвет - это вызов рекурсивной функции, а синяя- возврат):

132.jpg

Как ты видишь два вывода рекурсии резко увеличивает сложность задачи. Легче не имитировать этот кусок кода, а "придумывать" с нуля.
ura_111 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите с задачей по рекурсии: массив 1..N. с N переход на позицию N + 1 или N + 5. Определить с помощью рекурсии можно ли собрать сумму чисел K polsovatel C# (си шарп) 2 22.09.2016 02:52
Цикл For next делает только одну итерацию jirtreck Microsoft Office Excel 4 30.10.2015 16:56
Переделать рекурсию в итерацию в QBasic Abimeleh Помощь студентам 0 04.07.2015 22:42
маленькая задача на простую итерацию Генна Помощь студентам 0 02.04.2012 18:45
Перевод из рекурсии на итерацию Anubys Помощь студентам 0 18.04.2011 18:12