|
Рекурсия - возвращает неправильное значение в некоторых случаях
|
|||
---|---|---|---|
#18+
Добрый вечер. Есть функция Код: c# 1.
Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Класс BinaryNode Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22.
Она должна искать последний(самый нижний) правый потомок вершины. В случаях, если потомков несколько, всё нормально. Если потомок 1 - возвращает не его, а саму вершину, поданную на вход функции. Функция FindNode работает правильно. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.04.2017, 20:39 |
|
Рекурсия - возвращает неправильное значение в некоторых случаях
|
|||
---|---|---|---|
#18+
mraklbrwФункция FindNode работает правильно.Что дает нам эта информация? Зачем тут ref-параметр, при том, что функция возвращает void? В чем проблема сам узел возвращать? Кроме того, кейс совершенно непонятен. Приведите простой пример, который неверно работает. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.04.2017, 21:33 |
|
Рекурсия - возвращает неправильное значение в некоторых случаях
|
|||
---|---|---|---|
#18+
Код: c# 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.
В листбокс добавляем 2 3 5 9 1 0 4 7 - т.е. это вершины нашего дерева. При bt.FindNode(root_bn, 3, ref tempN); выдаёт 9, всё верно. Но при bt.FindNode(root_bn, 4, ref tempN); выдаёт 4, а должно 7. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.04.2017, 21:39 |
|
Рекурсия - возвращает неправильное значение в некоторых случаях
|
|||
---|---|---|---|
#18+
mraklbrw, Что мешало сделать так? Код: c# 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.
Вариант с ref убог до самой крайной крайности, хуже уже трудно что-то придумать. И рекурсия по сути тут тоже не к месту, так как легко словить переполнение стека. Вот так оптимально: Код: c# 1. 2. 3. 4. 5. 6.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.04.2017, 21:50 |
|
Рекурсия - возвращает неправильное значение в некоторых случаях
|
|||
---|---|---|---|
#18+
mraklbrwВ листбокс добавляем 2 3 5 9 1 0 4 7 - т.е. это вершины нашего дерева. При bt.FindNode(root_bn, 3, ref tempN); выдаёт 9, всё верно. Но при bt.FindNode(root_bn, 4, ref tempN); выдаёт 4, а должно 7. Где код FindNode? И при чём тут FindNode, когда речь шла о FindLastRightNode? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.04.2017, 21:51 |
|
Рекурсия - возвращает неправильное значение в некоторых случаях
|
|||
---|---|---|---|
#18+
Вы можете дать РАБОЧИЙ автономный пример? Который можно просто запустить и проверить. А не размышлять, что же скрывается за CheckString например и куда и в каком виде совать входные параметры. Никто не будет смотреть ваши простыни кода, как, например, в вашем первом вопросе. Если у вас нету опыта общения на форумах, предлагаю почитать на досуге это: 16726098 ... |
|||
:
Нравится:
Не нравится:
|
|||
18.04.2017, 21:53 |
|
Рекурсия - возвращает неправильное значение в некоторых случаях
|
|||
---|---|---|---|
#18+
Полный код BinaryTree Код: c# 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. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. 193. 194. 195. 196. 197. 198. 199. 200. 201. 202. 203. 204. 205. 206. 207. 208. 209. 210. 211. 212. 213. 214. 215. 216. 217. 218. 219. 220. 221. 222. 223. 224. 225. 226. 227. 228. 229. 230. 231. 232. 233. 234. 235. 236. 237. 238. 239. 240. 241. 242. 243. 244. 245. 246. 247. 248. 249. 250. 251. 252. 253. 254. 255. 256. 257. 258. 259. 260. 261. 262. 263. 264. 265. 266. 267. 268. 269. 270. 271. 272. 273. 274. 275. 276. 277. 278. 279. 280. 281. 282. 283. 284. 285. 286. 287. 288. 289. 290. 291. 292. 293. 294. 295. 296. 297. 298. 299. 300. 301. 302. 303. 304. 305. 306. 307. 308. 309. 310. 311. 312. 313. 314. 315. 316. 317. 318. 319. 320. 321. 322. 323. 324. 325. 326. 327. 328. 329. 330. 331. 332. 333. 334. 335. 336. 337. 338. 339. 340. 341. 342. 343. 344. 345. 346. 347. 348. 349. 350. 351. 352. 353. 354. 355. 356. 357. 358. 359. 360. 361. 362. 363.
Полный код Form1.cs Код: c# 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. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188.
hVostt, к сожалению, не работает предложенная Вами функция-- выдаёт тот же результат. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.04.2017, 22:36 |
|
Рекурсия - возвращает неправильное значение в некоторых случаях
|
|||
---|---|---|---|
#18+
С ref-ами делаю потому, что функции имеют тип bool. Чтобы потом можно было легко проверять, как прошла работа функции. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.04.2017, 22:37 |
|
Рекурсия - возвращает неправильное значение в некоторых случаях
|
|||
---|---|---|---|
#18+
mraklbrwС ref-ами делаю потому, что функции имеют тип bool. Чтобы потом можно было легко проверять, как прошла работа функции. Можно же возвращать null? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.04.2017, 22:47 |
|
Рекурсия - возвращает неправильное значение в некоторых случаях
|
|||
---|---|---|---|
#18+
Что-то там пошло не так. Я ещё думаю над этим. Надо бы переписать, действительно. А что можете сказать по функции GetLastRight? Само дерево строится правильно - это можно проверить функцией TraverseDepth. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.04.2017, 22:54 |
|
Рекурсия - возвращает неправильное значение в некоторых случаях
|
|||
---|---|---|---|
#18+
mraklbrw, Вообще, можно пройтись отладчиком, и глазами посмотреть что в каком порядке вызывается, как работает твоя рекурсия изнутри и очень быстро вычислить проблему. Рекомендую также заглянуть сюда: https://github.com/aalhour/C-Sharp-Algorithms/tree/master/DataStructures/Trees ... |
|||
:
Нравится:
Не нравится:
|
|||
18.04.2017, 22:56 |
|
Рекурсия - возвращает неправильное значение в некоторых случаях
|
|||
---|---|---|---|
#18+
mraklbrwЧто-то там пошло не так. Я ещё думаю над этим. Отладчиком пользоваться умеешь? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.04.2017, 22:57 |
|
Рекурсия - возвращает неправильное значение в некоторых случаях
|
|||
---|---|---|---|
#18+
Так себе. Сейчас вот думаю разобраться с эти делом посерьёзнее. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.04.2017, 23:04 |
|
Рекурсия - возвращает неправильное значение в некоторых случаях
|
|||
---|---|---|---|
#18+
Странное дело - не останавливается на точках останова. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.04.2017, 23:05 |
|
Рекурсия - возвращает неправильное значение в некоторых случаях
|
|||
---|---|---|---|
#18+
А, всё, решил (в Debug переключил). ... |
|||
:
Нравится:
Не нравится:
|
|||
18.04.2017, 23:08 |
|
Рекурсия - возвращает неправильное значение в некоторых случаях
|
|||
---|---|---|---|
#18+
Выяснил вот что: перед выполнением функции GetLastRight вершина tempN имеет параметры: left=null, right=null, хотя right не должно быть null, т.к. у неё есть правый потомок 7. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.04.2017, 23:13 |
|
Рекурсия - возвращает неправильное значение в некоторых случаях
|
|||
---|---|---|---|
#18+
mraklbrwПолный код Form1.cs Код: c# 1.
это точно не полный класс формы. Последний раз предлагаю вам сделать так, чтобы вам можно было помочь. Поставьте себя на место отвечающего. Что ему требуется сделать? - создать проект WinForms - создать форму - на форме расположить КАКИЕ-ТО контролы (перечень контролов нужно вычислить на основе вашего кода) - заполнить КАКИЕ-ТО контролы КАКИЕ-ТО данные (догадаться умозрительно) - нажать какие-то кнопки (вычислить или догадаться) - ГДЕ-ТО увидеть результат (то ли в отладчике, то ли в каком-то из контролов), понять, что в нем не так и что именно вы ожидали там увидеть Это будет делать разве что кто-то, кому особенно скучно. Последний раз предлагаю сделать все, чтобы получить ответ (ведь это в ваших интересах, кажется), а именно. - Убрать ВСЁ, что не относится конкретно к вопросу, выложить оставшиеся классы. - Выложить несколько команд, которые -- не относятся к каким-либо контролам (ведь вопрос у вас про неверную работу рекурсии, а не самой формы) -- можно запустить из консоли -- инициализируют все нужные данные и состояния -- внятно возвращают какой-то результат А также написать, какой результат ожидается и почему. Тогда вы достаточно быстро получите ответ (если с очень большой вероятностью не разберетесь с проблемой уже на вышеописанном этапе). ... |
|||
:
Нравится:
Не нравится:
|
|||
18.04.2017, 23:23 |
|
Рекурсия - возвращает неправильное значение в некоторых случаях
|
|||
---|---|---|---|
#18+
Проблема с функцией GetLastRight. Для последовательности вершин 2 3 5 9 1 0 4 7 - проверяем элемент 5 - возвращает 5, хотя должно 9. Переписал функцию так: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Тот же самый результат. Хотя вот эта функция - работает правильно: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Проект полностью: https://yadi.sk/d/EbhhiYjy3H88GN ... |
|||
:
Нравится:
Не нравится:
|
|||
19.04.2017, 10:53 |
|
Рекурсия - возвращает неправильное значение в некоторых случаях
|
|||
---|---|---|---|
#18+
Похоже, автор не нуждается в помощи. Попробуй еще несколько раз прочитать 20412845 , пока не станет понятно. ----------- Ну выложил ты проект, в нем две кнопки. При нажатии каждой из них проект падает - и дальше что? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.04.2017, 11:03 |
|
Рекурсия - возвращает неправильное значение в некоторых случаях
|
|||
---|---|---|---|
#18+
hVosttmraklbrw, Вообще, можно пройтись отладчиком, и глазами посмотреть что в каком порядке вызывается, как работает твоя рекурсия изнутри и очень быстро вычислить проблему. Рекомендую также заглянуть сюда: https://github.com/aalhour/C-Sharp-Algorithms/tree/master/DataStructures/Trees Фиговинький там способ получения перестановок. https://github.com/aalhour/C-Sharp-Algorithms/blob/master/Algorithms/Strings/Permutations.cs Вот лучше Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
... |
|||
:
Нравится:
Не нравится:
|
|||
19.04.2017, 11:23 |
|
Рекурсия - возвращает неправильное значение в некоторых случаях
|
|||
---|---|---|---|
#18+
ЕвгенийВ, Чёт не хочется иметь потенциальную возможность свалиться со StackOverflowException. Поэтому, не — не лучше, хотя компактно :) ... |
|||
:
Нравится:
Не нравится:
|
|||
19.04.2017, 12:38 |
|
Рекурсия - возвращает неправильное значение в некоторых случаях
|
|||
---|---|---|---|
#18+
hVosttЕвгенийВ, Чёт не хочется иметь потенциальную возможность свалиться со StackOverflowException. Поэтому, не — не лучше, хотя компактно :) Если list.Count() не сильно велик, не свалишься. Тут tot kturj OutOfMemoryException схватить. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.04.2017, 14:24 |
|
Рекурсия - возвращает неправильное значение в некоторых случаях
|
|||
---|---|---|---|
#18+
ЕвгенийВ, Надо ещё перфоманс надо бы затестить, это другая сторона кроме возможного переполнения стека. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.04.2017, 15:55 |
|
Рекурсия - возвращает неправильное значение в некоторых случаях
|
|||
---|---|---|---|
#18+
hVosttЕвгенийВ, Надо ещё перфоманс надо бы затестить, это другая сторона кроме возможного переполнения стека. Попробуй) Сравни с http://www.cplusplus.com/reference/algorithm/next_permutation/ ... |
|||
:
Нравится:
Не нравится:
|
|||
19.04.2017, 17:30 |
|
|
start [/forum/topic.php?fid=20&fpage=45&tid=1399941]: |
0ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
77ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
75ms |
get tp. blocked users: |
1ms |
others: | 13ms |
total: | 205ms |
0 / 0 |