Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Рекурсия 
:(
    Опции темы
Garcian
Дата 1.3.2009, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 5.11.2008

Репутация: нет
Всего: нет



Спасибо за предложение) Не совсем понимаю, как выделятся числа, но я попробую)

Добавлено через 4 минуты и 38 секунд
math64, не не не, всего то 5й месяц обучения  smile 
--------------------
Неродивый студент
PM MAIL   Вверх
mes
Дата 1.3.2009, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Garcian @  1.3.2009,  14:55 Найти цитируемый пост)
Кол-во символов не больше 5,

вот тут пример, тоже по перестановкам :
http://forum.vingrad.ru/index.php?showtopi...t&p=1723750
хоть и задание там несколько другое, но надеюсь получится переделать самому, так как ничего "необычного" в коде не использовано smile 

Это сообщение отредактировал(а) mes - 1.3.2009, 16:38


--------------------
PM MAIL WWW   Вверх
Albor
Дата 1.3.2009, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 589
Регистрация: 28.2.2009

Репутация: 2
Всего: 9



Особо не ломаем голову, а подключаем #include<algorithm> и юзаем функцию next_permutation, принимающую указатель на начало и конец диапазона. Функция делает перестановку в лексикографическом порядке (то есть каждая следующая перестановка больше предыдущей) и возвращает логическое значение (true, если перестановка не последняя. Значит можно запустить в цикле). Конечно, исходный диапазон перед перестановками сортируем по возрастанию. Нельзя использовать массив - читаем входные данные в string (внутри это конечно массив, но извне - объект строка). Кстати, количество перестановок не обязательно равно n!. например число 112 - три возможных значения.
PM MAIL ICQ   Вверх
Dmi3ev
Дата 1.3.2009, 17:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1698
Регистрация: 28.11.2007

Репутация: 13
Всего: 41



от хранения цифр никуда не деться... поэтому глупое требование, чтобы без массива, все равно в той или иной степени, будет массив, или это будет строка символов (что тоже массив), или это будет файл, в котором записаны символы, что тоже массив, либо будет указатель и будет выделяться паямять, что тоже вроде массива, либо будут пять переменных, что тоже несильно отличается от массива... хз, ща в тупую ломану, посмотрю, может че в голову придет оп дороге...


--------------------

PM MAIL   Вверх
Albor
Дата 1.3.2009, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 589
Регистрация: 28.2.2009

Репутация: 2
Всего: 9



Вероятно можно и без массива. например, из данного числа, путём математических действий, получить большее, но состоящее из тех же цифр, затем ещё и ещё, пока не получен максимум. Нужно только вывести формулу, но это к математикам.
PM MAIL ICQ   Вверх
mes
Дата 1.3.2009, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



если я правильно понял, то
Цитата(Albor @  1.3.2009,  16:12 Найти цитируемый пост)
Особо не ломаем голову, а подключаем #include<algorithm> 

Цитата(Garcian @  1.3.2009,  14:55 Найти цитируемый пост)
Пространство std:: использовать тоже нельзя) 

Цитата(Albor @  1.3.2009,  16:12 Найти цитируемый пост)
Kоличество перестановок не обязательно равно n!. например число 112 - три возможных значения. 

Цитата(Garcian @  1.3.2009,  14:16 Найти цитируемый пост)
Напечатать все перестановки заданных n различных натуральных чисел (или символов)"



Это сообщение отредактировал(а) mes - 1.3.2009, 17:25


--------------------
PM MAIL WWW   Вверх
Dmi3ev
Дата 1.3.2009, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1698
Регистрация: 28.11.2007

Репутация: 13
Всего: 41



в голову ничего не пришло, что могло бы избавить от массива...
вот вариант в тупую, без массива, но с указателем...
Код

#include "stdafx.h"
#include <iostream>

using namespace std;

int fact (int n)
{
    if(n==0)
        return 1;
    else
        return (n*fact(n-1));
}
int _tmain()
{
    int *c, n;
    cout<<"How many numbers?\n n=";
    cin>>n;

    if (n>5 || n<1)
    {
        cout<<"Error: n>5 or n<1"<<endl;
        system("pause");
        return 0;
    }

    c=new int[n];
    for (int i=0; i<n; i++)
    {
        cout<<"Enter number "<<i+1<<": ";
        cin>>*(c+i);
    }

    cout<<endl<<"Results: "<<endl;
    cout<<"Factorrial: "<<fact(n)<<endl;
    switch (n)
    {
    case 5:
    for (int i=0; i<n; i++)
        for(int i1=0; i1<n; i1++)
          if (i1!=i)
            for(int i2=0; i2<n; i2++)
              if (i2!=i && i2!=i1)
                  for (int i3=0; i3<n; i3++)
                      if(i3!=i2 && i3!=i1 && i3!=i)
                          for (int i4=0; i4<n; i4++)
                              if (i4!=i2 && i4!=i1 && i4!=i && i4!=i3)
                                  cout<<endl<<c[i]<<"; "<<c[i1]<<"; "<<c[i2]<<"; "<<c[i3]<<"; "<<c[i4]<<"; ";
    break;
    case 4:
        for (int i=0; i<n; i++)
            for(int i1=0; i1<n; i1++)
                if (i1!=i)
                    for(int i2=0; i2<n; i2++)
                        if (i2!=i && i2!=i1)
                            for (int i3=0; i3<n; i3++)
                                if(i3!=i2 && i3!=i1 && i3!=i)
                                    cout<<endl<<c[i]<<"; "<<c[i1]<<"; "<<c[i2]<<"; "<<c[i3]<<"; ";
        break;
    case 3:
        for (int i=0; i<n; i++)
            for(int i1=0; i1<n; i1++)
                if (i1!=i)
                    for(int i2=0; i2<n; i2++)
                        if (i2!=i && i2!=i1)
                            cout<<endl<<c[i]<<"; "<<c[i1]<<"; "<<c[i2]<<"; ";
        break;
    case 2:
        for (int i=0; i<n; i++)
            for(int i1=0; i1<n; i1++)
                if (i1!=i)
                    cout<<endl<<c[i]<<"; "<<c[i1]<<"; ";
        break;

    case 1:
        cout<<endl<<c[0]<<"; ";
        break;

    }        
    cout<<endl;
    system("pause");
    return 0;
}



Это сообщение отредактировал(а) Dmi3ev - 1.3.2009, 17:30


--------------------

PM MAIL   Вверх
mes
Дата 1.3.2009, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Albor @  1.3.2009,  16:23 Найти цитируемый пост)
Нужно только вывести формулу, но это к математикам. 

вряд ли так как 
Цитата(Garcian @  1.3.2009,  15:10 Найти цитируемый пост)
всего то 5й месяц обучения  smile  




--------------------
PM MAIL WWW   Вверх
zim22
Дата 1.3.2009, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(Dmi3ev @  1.3.2009,  17:27 Найти цитируемый пост)
c=new int[n];

представляю возмущение преподавателя: "А это что такое? Массив? Я же предупреждал тебя! Всё, ты отчислен!"  smile

и если пространоство std использовать нельзя, то что мешает его не использовать, а копировать из него необходимые функции?

ещё можно функцию swap применить для двух случайных цифр из числа. 
полученное новое число сохраним в списке. 
снова применим функцию swap.
пройдёмся по списку. 
если числа нет такого - добавим его в список. 
я думаю за миллион итераций все перестановки как раз и нагенерируются.

Это сообщение отредактировал(а) zim22 - 1.3.2009, 18:21


--------------------
PM MAIL   Вверх
math64
Дата 1.3.2009, 21:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 12
Всего: 72



Ну за 5 месяцев мможно было бы научиться работать с массивами и указателями.
Здесь требуется доступ ко всем предыдущим итерациям и без массива или списка не обойтить.
Массивы монжно скрыть в числах:
long (32 Битный) - 9 десятичных цифр, до n=9
int64 - 16 шестнадцатиричных цифр, до n=16
Если требуется рекурсивный алгоритм, данные лучше хранить в списке, в классическом языке использующем рекурсию ЛИСПе данные тоже хранятся в списках.
Код

struct list {
  int number;
  struct list* prev;
};

void print_list(struct list* l) {
   if (l == NULL)
     return;
   print_list(l->prev);
   printf(" %d", l->number);
}

bool is_in_list(int n, struct list* l) {
  if (l == NULL)
    return false;
  is_in_list(l->prev, n); 
}

void perestanovki (int n, struct list* l) {
  int i;
  struct list data;
  data.prev = l;
  data.number = -1;
  for(i = 1; i <= n; i++) {
    if (!is_in_list(n, l)) {
      data.number = i;
      perestanovki(n, &data);
    }
  }
  if (data.number == -1)
    print_list(l);
}

Можно обойтись и без структур, используя функции с переменным числом агрументов (...)
PM   Вверх
Garcian
Дата 2.3.2009, 01:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 5.11.2008

Репутация: нет
Всего: нет



Dmi3ev, а где здесь рекурсия, помимо факториала (по ходу нет)?
Albor, мда, в самом деле, зачем голову ломать, преподаватель дурачок ничего не понимает  smile 


--------------------
Неродивый студент
PM MAIL   Вверх
mes
Дата 2.3.2009, 01:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Garcian @  2.3.2009,  00:20 Найти цитируемый пост)
а где здесь рекурсия

 а где в задании говорится об решении через рекурсию ? кроме упоминания в названии темы (что говорит лишь о  Вашем предположении о способе решения), я иных указаний не нашел.

Добавлено через 1 минуту и 49 секунд
да и вобще как можно спрашивать решение, когда само задание (может и ошибаюсь) полностью не освещено ?! smile 



--------------------
PM MAIL WWW   Вверх
Albor
Дата 2.3.2009, 07:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 589
Регистрация: 28.2.2009

Репутация: 2
Всего: 9



Цитата(Garcian @ 2.3.2009,  00:20)
Albor, мда, в самом деле, зачем голову ломать, преподаватель дурачок ничего не понимает  smile

Кто сказал о дурачке? Тебе предложили варианты - выбирай. Когда-то и нам задавали такую задачу, но массивы не запрещались. Перерыв кучу информации по алгоритмам такого рода задача была решена, а, через какое-то время, заглянул в STL и та же задача решилась в несколько строк кода. Успехов.
PS Если преподавателю представить хоть какое-то решение, думаю, что это уже +. 
PM MAIL ICQ   Вверх
Dmi3ev
Дата 2.3.2009, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1698
Регистрация: 28.11.2007

Репутация: 13
Всего: 41



Цитата

Dmi3ev, а где здесь рекурсия, помимо факториала (по ходу нет)?

а где спасибо...
в задании действительно нигде не сказано, где должна быть рекурсия, и должна ли она быть... так что будь недоволен только собой, не только не справился с задачей, но даже не смог ее нормально сформулировать...
слушай, что mes говорит... 
Цитата

да и вобще как можно спрашивать решение, когда само задание (может и ошибаюсь) полностью не освещено ?! 

это 99% успеха, а когда оно размыто, как в твоем случае, мы сами выпытываем у тебя что можно, что нужно...
и советы:
1) ты должен быть доволен и такому коду... потому как своего никакого нет... 
3) ты можешь потратить свое драгоценное время и увидеть некое сходство в последовательных шагах, и выделить их в рекурсивную функцию... или не можешь))) дело за тобой)))



--------------------

PM MAIL   Вверх
Garcian
  Дата 2.3.2009, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 5.11.2008

Репутация: нет
Всего: нет



Dmi3ev,  спасибо, а где второй пункт  smile. По 3му пункту - не сомневайся, мой прозорливый ум уже это подметил  smile 
В задании не указано, но рекурсия обязательна (в следующий раз буду уточнять). Вообще это заданиие из таких типов, как "анализатор скобок" например. 

Сегодня еще раз спросил у препода насчет массивов - сказал нельзя! На вопрос " А как тогда?", он ехидно ответил "Не знаю".

зы: не я же задачи эти придумываю) Чтоб его понять я несколько дней потратил)
зыы: преподаватель даже не смотрит решение, если хоть что то не так)) Максимум укажет ошибку (что редко), а сам скажет - думайте дальше  smile 



Это сообщение отредактировал(а) Garcian - 2.3.2009, 17:33
--------------------
Неродивый студент
PM MAIL   Вверх
Страницы: (4) Все 1 [2] 3 4 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0606 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.