![]() |
Модераторы: LSD, AntonSaburov |
![]() ![]() ![]() |
|
Pawl |
|
||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 649 Регистрация: 22.4.2008 Где: Витебск Репутация: 7 Всего: 28 |
Доброго времени суток. Когда "помогал" своему товарищу делать к зачету программки по теме рекурсия, понял, что сам в этом деле не все понимаю. Так, например, есть код, который с помощью рекурсии выводит на экран сначала +, потом - элементы массива. При элементе, равном 0, вывод заканчивается. Код этот я нашел на делфи и из спортивного интереса переделал его на яву. Привожу обе программки:
Так все работает прекрасно, но когда я в коде на делфи заменил рекурсивную строку print(x, i + 1); на print(x, inc(i)); на этапе компиляции у меня появилась ошибка
Ну ладно, возможно при замене операции i + 1 на операцию inc(i) действительно может возникнуть несоответствие типов. В ява инкремент встроен, поэтому там возникла другая ошибка: при замене в рекурсии i + 1 на i++, сначала много раз вывелся 0-вой элемент массива, а затем произошло переполнение стека:
Конечно, при вставке в рекурсивный вызов i++ вместо i + 1, изменяется само значение i, и, скорее всего, в этом все дело, но если заменить i++ на ++i, программа опять таки заработает нормально. Я понимаю разницу между i++ и ++i, но не совсем понимаю, как это работает в рекурсии. Буду очень благодарен, если кто-нибудь мне доходчиво объяснит. Спасибо! -------------------- В действительности всё совсем не так, как на самом деле |
||||||||
|
|||||||||
FewG |
|
||||||
![]() Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 23.11.2010 Репутация: нет Всего: нет |
Здесь как раз дело в разнице между i++ (постинкремент) и ++i (преинкремент). С i++ код работает не верно, ведь при вызове
Методу передается 0, ибо int i не был еще инкрементирован -> значит для следующего вызова
i будет всё ещё равен 0 и так далее пока стек не будет переполнен. С преинкрементом другое дело, перед тем как передать значение int i, оно будет увеличенно на 1. |
||||||
|
|||||||
Pawl |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 649 Регистрация: 22.4.2008 Где: Витебск Репутация: 7 Всего: 28 |
Спасибо, я, в принципе, так и думал. Добавлено через 26 секунд Тема закрыта -------------------- В действительности всё совсем не так, как на самом деле |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Java" | |
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |