![]() |
Модераторы: LSD, AntonSaburov |
![]() ![]() ![]() |
|
Pawl |
|
||||||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 649 Регистрация: 22.4.2008 Где: Витебск Репутация: 7 Всего: 28 |
господа,
недавно нашел код на C#, описывающий задачу о рюкзаке. К слову, алгоритм не идеальный, но речь о другом. В учебно-воспитательных целях переложил его на яву, и вот что у меня получилось:
а вот вывод этой программы:
как видно строчка
отработала некорректно. Если вместо нее написать
то вывод итогов будет правильным:
также корректно напечатается итог, если его вывод делать непосредственно в методе next(), т. е.
вот мне и непонятно, что же мешает после операции max = current; вывести значения полей mass и price объекта max в методе main? Ведь в методе next(), непосредственно перед выходом из него, они выводятся как надо! -------------------- В действительности всё совсем не так, как на самом деле |
||||||||||||
|
|||||||||||||
jk1 |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1168 Регистрация: 17.10.2008 Где: Санкт-Петербург Репутация: 40 Всего: 75 |
Вот этот код
приводит к тому, что теперь обе ссылки указывают на один и тот же объект в памяти. После этого Вы затираете значения в current, соответственно и по ссылке max тоже будут нули. Этот код
не присваивает ссылок, а просто копирует поля, то есть две разные ссылки будут и дальше указывать на два конкретных объекта. И обнуление полей current никак не скажется на max. Это сообщение отредактировал(а) jk1 - 29.12.2011, 16:50 -------------------- Opinions are like assholes — everybody has one |
||||
|
|||||
Pawl |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 649 Регистрация: 22.4.2008 Где: Витебск Репутация: 7 Всего: 28 |
да, но почему тогда работает
ведь тут тот же принцип? -------------------- В действительности всё совсем не так, как на самом деле |
|||
|
||||
jk1 |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1168 Регистрация: 17.10.2008 Где: Санкт-Петербург Репутация: 40 Всего: 75 |
В этот раз Вы выводите значения из max до того, как обнулили current. Обнуление происходит вот тут:
Соответственно до этого момента в max можно найти корректный результат, а после уже нет. -------------------- Opinions are like assholes — everybody has one |
||||
|
|||||
Pawl |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 649 Регистрация: 22.4.2008 Где: Витебск Репутация: 7 Всего: 28 |
if (current.price > max.price) - условие выполнилось, max = current; и return; - max ссылается на current. - где тут обнуление current? -------------------- В действительности всё совсем не так, как на самом деле |
|||
|
||||
jk1 |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1168 Регистрация: 17.10.2008 Где: Санкт-Петербург Репутация: 40 Всего: 75 |
Обнуление происходит за счет последовательного вычитания при возврате рекурсии. Да, там где нашли максимум был сделан return. Теперь смотрим внимательно откуда при этом вызывался метод next() - из строки 65 Вашего примера наверху. Вот он возвращает, а дальше
ну и так до тех пор, пока не развернется вся рекурсивная цепочка. Не верите мне - запустите отладчик и убедитесь сами. -------------------- Opinions are like assholes — everybody has one |
||||
|
|||||
Pawl |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 649 Регистрация: 22.4.2008 Где: Витебск Репутация: 7 Всего: 28 |
Ок, убедился, спасибо! ![]()
как видно, здесь в методе next() так же есть строчка max = current; но тут-то это прокатывает! Может, потому, что Item не class а struct? В яве структур нету, поэтому я не совсем представляю разницу. В NETe я кое-что про это нарыл, но всё-равно толком не въехал! ![]() -------------------- В действительности всё совсем не так, как на самом деле |
|||
|
||||
jk1 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1168 Регистрация: 17.10.2008 Где: Санкт-Петербург Репутация: 40 Всего: 75 |
Структуры копируются при присваивании. При присваивании структуры к новой переменной выполняется копирование всех данных, а любое изменение новой копии не влияет на данные в исходной копии.
В Java структур нет, так что переносить алгоритм, заменяя структуры классами, не всегда безопасно. -------------------- Opinions are like assholes — everybody has one |
|||
|
||||
Pawl |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 649 Регистрация: 22.4.2008 Где: Витебск Репутация: 7 Всего: 28 |
Спасибо!
-------------------- В действительности всё совсем не так, как на самом деле |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Java" | |
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |