Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Рекурсия 
V
    Опции темы
sashkr
  Дата 5.6.2008, 22:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



помогите пожалуйста с задачей на рекурсию

дан одномерный массив int и число int надо написать функцию boolean которая получает число(к массиву можно обращаться напрямую в классе) и возвращает true если в массиве есть числа сумма которых равна полученному числу,false если нет. 
PM MAIL   Вверх
Platon
Дата 5.6.2008, 22:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Можно попробовать бектрейс

Код

boolean[] visited;
int[] arr;
boolean sumExists(int need, int cur) {
    if (need == cur) return true;
    for (int i = 0; i < arr.length; i++) if (!visited[i]) {
        visited[i] = true;
        if (solve(i, cur + arr[i]))
            return true;
        visited[i] = false;
    }
    return false;
}


запускать надо sumExists(N, 0);
PM MAIL ICQ   Вверх
sashkr
Дата 5.6.2008, 22:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



спасибо,забыл написать что функция не может пользоваться циклами вообще

Добавлено @ 22:40
я что-то написал,но не совсем работает..
Код


public boolean cover(int amount)
    {
    
        return cover(0,amount);

    }
    
    private boolean cover(int i, int amount)
    {
        if(amount==0)
            return true;
            
        if(i==_arr.length-1)
            if((amount-_arr[i])==0) return true;
                else return false;
                
        if((amount-_arr[i])<0)
        {
            i++;
            return cover(i,amount);
        }
 
        if(cover(i+1,amount-_arr[i]))
        return true;
        else{i++;
            return cover(i,amount);
        }


Это сообщение отредактировал(а) powerOn - 5.6.2008, 23:59
PM MAIL   Вверх
Platon
Дата 5.6.2008, 23:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(sashkr @  5.6.2008,  23:37 Найти цитируемый пост)
я что-то написал,но не совсем работает..

Ага, и я что-то сказал, но не совсем объяснил.
Код

boolean cover(int[] arr, int i, int am) {
    if (am == 0) return true;
    if (am < 0) return false;
    if (i >= arr.length) return false;
    return cover(i + 1, am - arr[i]) || cover(i + 1, am);
}

Вспомнил старый добрый курс Lisp'а cover(new int[]{1,2,3}, 0, 4)

Добавлено через 5 минут и 10 секунд
Помню, на таких задачках денюшки только так рубил. Боятся люди рекурсии, непонятно почему?

Это сообщение отредактировал(а) Platon - 5.6.2008, 23:08
PM MAIL ICQ   Вверх
sashkr
Дата 5.6.2008, 23:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



в массиве {5,22,13,5,7,-4} проблема с 31(22+13-4)..
 
с нулём можешь подсказать что делать,я вот тоже написал,вроде работает-правда не совсем понимаю какsmile)
но с нулём тоже проблема...
Код


public boolean cover(int amount)                     //функ для пользовотеля
    {
    
        return cover(_arr.length-1,amount);

    }
    
    private boolean cover(int i, int amount)
    {
        if(amount==0)
            return true;
            
        if(i<=0)
            if((amount-_arr[i])==0) return true;
                else return false;
                
        if((amount-_arr[i])<0)
        {
            i--;
            return cover(i,amount);
        }
        
        if(cover(i-1,amount-_arr[i]))
        return true;
        else{i--;
            return cover(i,amount);
        }
        
    }


Добавлено @ 23:28
кстати спасибо огромное за внимание и помощь!!!!!

Это сообщение отредактировал(а) powerOn - 6.6.2008, 00:00
PM MAIL   Вверх
Platon
Дата 6.6.2008, 04:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Окэй, тогда в моей схеме убери ветку на проверку меньше нуля:

Код

boolean cover(int[] arr, int i, int am) {
    if (am == 0) return true;
    if (i >= arr.length) return false;
    return cover(arr, i + 1, am - arr[i]) || cover(arr, i + 1, am);
}


Добавлено @ 04:22
Цитата(sashkr @  6.6.2008,  00:28 Найти цитируемый пост)
я вот тоже написал

Батенька, у вас черт ногу сломит. Очень "хитро накосячено", тяжко для понимания. Скорее всего твой преподаватель попутал курсы, обычно обучение мастерству рекурсий обучают на лиспе, но скорее всего он ждет от тебя моего решения. Моё решение, как раз стилизованно под лисповский подход, так что примите к сведению.

Это сообщение отредактировал(а) Platon - 6.6.2008, 05:13
PM MAIL ICQ   Вверх
sashkr
Дата 6.6.2008, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Преогромное спасибо, smile 
PM MAIL   Вверх
Platon
Дата 6.6.2008, 17:13 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Помогли тебе, помоги другим!
PM MAIL ICQ   Вверх
Gaon
  Дата 7.6.2008, 03:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



вы бы не могли объяснить как действует эта рекурсия?
PM MAIL   Вверх
Platon
Дата 7.6.2008, 09:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Gaon, давайте я оставлю это на самостоятельное изучение. Уж в 3-х строчках кода разобраться, ну совсем, несложно.

Добавлено через 41 секунду
Сдается мне вы ребята с 1 учебного заведения?
PM MAIL ICQ   Вверх
Gaon
Дата 7.6.2008, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



похоже что  с одного. 

как я понял
  cover(arr, i + 1, am - arr[i]) вычитает из суммы числа с массива, а вот что дает 
cover(arr, i + 1, am)  и как они относятся один к другому...... 

 будем грызть дальше  smile 
PM MAIL   Вверх
Platon
Дата 7.6.2008, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Думай-думай. Я и так уже рыбу тебе поймал, хотя рекомендуют давать только удочки. Хоть разделай ее самостоятельно. Предлагай версии, я скажу - правильно думаешь или нет.

Добавлено через 5 минут и 28 секунд
Давай так. Вообще как ты видишь решение этой задачи без рекурсии, без машинного языка. На словах, сам алгоритм.
PM MAIL ICQ   Вверх
Gaon
Дата 7.6.2008, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



 допустим есть сумма 23 , и числа 2,13, 10.

из сумми вичитаетса 2, если остаток менше 23 и больше 0 вичитается 2 число и тд. до конца. 


если остаток не поподает в этот промежуток, прыгаем на 2 число и тд.


PM MAIL   Вверх
Platon
Дата 7.6.2008, 19:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



хм, интересно а такая последовательность у тебя не пройдет: 23, {2, -13, 36} а по условию сказано, что в последовательности может быть отрицательное число, думай дальше.
PM MAIL ICQ   Вверх
Gaon
Дата 7.6.2008, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



23,{2,-13,36}

тогда вычитаем первое число из сумм и провераем если есть остаток в данных если есть или нет.

помоему ты так и сделал
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




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


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

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