|
|
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
Добрый день , друзья. Помогите дилетанту . Не могу разобраться , почему моя рекурсивная функция переполняет кучу. Тупая реализация классической задачки на обход конем доски. Я правда так и не разобрался пока как закончить её выполнение. Но это не сильно и важно. (на данный момент просто хотелось бы добиться чтобы высветилось хотя бы одно решение, пусть и с зацикливанием) Пытаюсь даже выводить грубо глубину рекурсии - она теоретически не должна превышать 64 - так и есть. Однако при длительной работе (а дерево разрастается очень стремительно) высвечивает Java heap space. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2016, 12:05 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
2 ** 64 ~ 10 ** 18 Терабайт это 10 ** 12 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2016, 12:12 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
Basil A. Sidorov2 ** 64 ~ 10 ** 18 Терабайт это 10 ** 12 то есть вы хотите сказать, что когда 64 процедуры вызывают последовательно друг друга , то памяти отъедается более терабайта ? :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2016, 12:50 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
Я хочу сказать, что есть "рекурсия вглубь" и "рекурсия вширь". P.S. Мне лень разбираться в попытках решить методом полного перебора задачу, которую (насколько мне изменяет склероз) умные люди давно решили вручную. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2016, 12:57 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
Basil A. Sidorov, эта именно тупо вглубь . что значит решили вручную ? )))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2016, 13:06 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
Ну, например, в старом журнале ("Наука и жизнь", если правильно помню) была статья, где в качестве одного из способа запоминания ходов автор придумал стихи, строчки которых были мнемониками шахматных клеток. Журнал - не младше середины-конца восьмидесятых. P.S. Насколько я помню вполне классическую "Алгоритмы + структуры данных = программы", принципиально разных решений всего двенадцать. Издание начала восьмидесятых. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2016, 13:19 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
Хотя, вру - у Вирта решается задача расстановки восьми ферзей. Чтобы рекурсия была вглубь требуются две вещи стратегия обхода и запоминание "границы отсечения". Когда на каждом шаге перебираются все возможные варианты это именно что рекурсия вширь. P.S. Я бы предложил разбираться с рекурсией на гораздо более простой задаче: лабиринт без циклов, где на каждом шаге можно повернуть или влево или вправо и глубина любого пути не превышает заданного (небольшого) числа шагов. Начинать с лабиринтов, которые можно нарисовать на листе школьной тетради в клеточку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2016, 13:38 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
Basil A. Sidorov, да, совершенно верно , есть у меня такая . там приведён даже шаблон перемещения по дереву с возвратом. именно им я и воспользовался. возможно различие решений только лишь в представлении данных . Но моё решение судя по всему рабочее. дерево обходится в глубину как надо. Но это всё не суть... Разбираться в моём коде я никого не прошу. просто хочу для себя разобраться почему происходит переполнение памяти. максимально в любой период времени работы программы может быть не более 64 вызова процедуры. одна процедура резервирует грубо говоря: 3 переменных int (96 байт), один массив (64 байта) переменная типа String может в последней проблема ? я толком не понимаю пока эта переменная фиксированной длины или же переменной ? почему вы насчитали, что памяти должно резервироваться более терабайта ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2016, 13:45 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
Basil A. SidorovХотя, вру - у Вирта решается задача расстановки восьми ферзей. нет, не врете. кони тоже решаются в моем издании ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2016, 13:46 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
И ещё: чтобы не путать глубину рекурсии с числом (активных) рекурсивных вызовов - сделайте статическую, которая будет увеличиваться на входе в рекурсивный метод и уменьшаться на выходе. Ну и печатайте значение этой переменной по мере надобности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2016, 13:47 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
Basil A. SidorovИ ещё: чтобы не путать глубину рекурсии с числом (активных) рекурсивных вызовов - сделайте статическую, которая будет увеличиваться на входе в рекурсивный метод и уменьшаться на выходе. Ну и печатайте значение этой переменной по мере надобности. так и делал . за исключением статики ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2016, 13:49 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
andron81, стоп. статическую что вы имеете ввиду ? переменную или метод вызова статический ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2016, 13:51 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
andron81, это вы имеете ввиду ? Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. у меня переменная depth сейчас считается так же за исключением того , что объявлена она не как static. честно говоря не чувствую разницы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2016, 13:57 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
Статика непринципиальна. Просто вы считаете именно что глубину рекурсии, а считать надо число активных вызовов. Цепочка вызовов активна до тех пор пока мы или не нашли (очередное) решение или не обнаружили, что эта цепочка ходов решением не является. Когда вы осознаете, что каждый узел в цепочке вызовов порождает свою цепочку вызовов, вам станет понятнее "куда девается память". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2016, 14:01 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
Basil A. Sidorov, как я понимаю мой алгоритм в любой момент времени хранит только лишь текущую самую глубокую ветку и всю цепочку до неё . остальные пройденные субдеревья и не приведшие к удаче в данный момент не хранятся. Или нет ? вот на рисунке мы скажем в данный промежуток времени проделали маршрут 1->7->8->9->12. мы этот маршрут и храним. пусть даже до этого были маршруты 1->2-> 3-> 4 1->2-> 3-> 5 1->2-> 3-> 6 а так же 1->7->8->9->10->11 но они не привели к решению . ну значит мы по ним и выполнили всюду return-ы , а это значит и память по ним расчистилась. Или же нет ? а маршрут 1->7->8->9->12 это 5 вызовов. и глубина = 5. или же нет ?? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2016, 14:30 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
Basil A. SidorovЦепочка вызовов активна до тех пор пока мы или не нашли (очередное) решение или не обнаружили, что эта цепочка ходов решением не является. верно и это понятно. но цепочка вызовов не может превышать 64 (число ходов, а значит клеток на шахматной доске). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2016, 14:58 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
Кстати, об ограничениях ... Чтобы шестьдесят четвёртым ходом оказаться в точке (0,0), на шестьдесят третьем ходу надо быть или в точке (2,1) или в точке (1,2). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2016, 18:17 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
Basil A. Sidorov, блин, да нет же. задача стоит проще: просто обойти абсолютно все клетки , закрасив их. кстати, я Вам соврал. похоже, что ругается консоль . "io console updater java heap space" я наверно превысил допустимое число вывода на экран . кстати , можно ли выводить не в консоль , а в файл (Eclipse) ? гугл не помог. а "ругань" превышения допустимых вызовов рекурсивной функции выглядит иначе. достаточно накидать программу n! и поставить в качестве входного параметра скажем громадное число. там со стэком будет ошибка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2016, 18:32 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
andron81, P.s. стоит задача обойти все клетки конем побывав ровно по одному в каждой ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2016, 18:33 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
andron81, =) помню сдавал такую курсовую два раза за обучение :) Вот пример . тут даже с графикой ) http://5fan.ru/wievjob.php?id=49236 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2016, 16:12 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2016, 16:53 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
Atum1, спасибо , конечно, интересней самому решить, что я и сделал. для начальной точки 1,1 выдаёт решения за время меньше минуты. а вот на точке 1,2 выходит в ступор. дерево разрастается настолько , что и за 40 минут ни одного решения не выдаёт ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2016, 18:47 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
Atum1 http://algolist.manual.ru/maths/combinat/knight.php хотя интересное правило Варнсдорфа описано. но я правило такого не знал. поэтому у меня тупой перебор всего дерева. поэтому видимо и долго ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2016, 18:58 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
Лет 10 назад я кодил на С++/Win32 GDI приложение для решения horse problem. Чтоб рекурсия не заходила в слишком глубокие поиски я разработал правила построения кориродов (только для прямоугольной доски) чтобы ограничить для коня следущие несколько N ходов. Для этого я выбирал ширину коридора (4 клетки) и змейкой заполнял всю доску. К сожалению сорцы потерял. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2016, 19:31 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=39364021&tid=2123359]: |
0ms |
get settings: |
11ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
59ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
66ms |
get tp. blocked users: |
1ms |
| others: | 248ms |
| total: | 421ms |

| 0 / 0 |
