-21 / 3 / 0
Регистрация: 01.09.2017
Сообщений: 21
|
||||||
1 | ||||||
Логическая ошибка при рекурсии29.03.2018, 19:48. Показов 1206. Ответов 6
Метки нет Все метки)
(
Решил задачу в теме про рекурсию. Использован алгоритм Евклида. Условие:
Напишите рекурсивную функцию вычисления наибольшего общего делителя двух положительных целых чисел (Greatest Common Divisor, GCD). Для этого воспользуйтесь следующими свойствами. Требования к реализации: в данном задании запрещено пользоваться циклами. Вы можете заводить любые вспомогательные функции, если они вам нужны. Проблема в том, что мой рекурсивный алгоритм в функции, которая вызывает себя, работает корректно ровно до последней итерации(когда одно из значений становится равно 0). А конкретно часть (a = m) и (b = m) попросту игнорируется. И дело даже не в проверке на равенство нулю перед алгоритмом, потому что когда управление передаётся строке 9, условия как раз выполняются. Я проверял, убирал проверку. Вывод в строке 10 добавлен только чтобы показать какие значения принимают аргументы функции на каждом этапе итерации. По логике вещей значение b в последней итерации должно было ровняться 0. Следовательно возвращать я должен бы то значение, которое больше, а не то которое меньше. Почему так происходит? Где ошибка? Мой код
0
|
|
29.03.2018, 19:48 | |
Ответы с готовыми решениями:
6
Логическая ошибка логическая ошибка!! Неведомая логическая ошибка (С++) |
473 / 425 / 290
Регистрация: 10.03.2015
Сообщений: 1,782
|
|
29.03.2018, 20:00 | 2 |
Ну если b = 0, то при проверке условия, мы выйдем в else, и выведем a+b, в твоем случае 0+6 = 6
0
|
-21 / 3 / 0
Регистрация: 01.09.2017
Сообщений: 21
|
||||||
30.03.2018, 15:06 [ТС] | 3 | |||||
Уважаемые знатоки, повторяю ещё раз. Проверка тут не при чём. Для примера, скомпилируйте код без строк 7 и 12, вывод не изменится, если не использовать как аргумент 0, разумеется(тогда программа крашится, потому что происходит деление на 0 в алгоритме). Если вы не знаете, просто не сталкивались с подобной ошибкой, или вам лень думать, то пожалуйста не отвечайте в этой теме
Мы не выйдем в else по той простой причине, что в последнем вызове функции gcd m будет равно 0 и вместо очередного вызова функции gcd она вернёт значение в вызывающую функцию gcd, а та в предыдущую, и так далее пока первая вызванная gcd не вернёт значение в main, а та выведет его на экран
0
|
666 / 469 / 215
Регистрация: 06.09.2013
Сообщений: 1,295
|
|
30.03.2018, 15:12 | 4 |
FeewrE, а зачем вы такую, извините, ерунду пишете
(a > b) ? ((m = a % b) && (a = m)) : ((m = b % a) && (b = m)); возможно, у вас он вычисляет первый операнд логического И, он - ноль, второй считать не надо, оптимизация, однако. Кто вас научил так писать? Пишите обычный if.
0
|
473 / 425 / 290
Регистрация: 10.03.2015
Сообщений: 1,782
|
||||||
30.03.2018, 15:19 | 5 | |||||
Конечно не сталкивались, код то твой.
Преобразуйте тернарный оператор в условный, так легче дебажить. В последний момент b не присваивало значение m. По правде говоря, сама конструкция такого присвоения весьма чудная.
0
|
1272 / 1029 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
|
|
30.03.2018, 15:22 | 6 |
![]() Решение
Функция вызывается, а возвращаемое значение не используется. Логическая ошибка, однака.
0
|
473 / 425 / 290
Регистрация: 10.03.2015
Сообщений: 1,782
|
||||||
30.03.2018, 15:27 | 7 | |||||
likehood, да, причем если нормально писать возвращение из рекурсии, в какой-то момент всплывает
![]() Добавлено через 3 минуты А вообще, используйте нормальную версию рекурсивной функции, или расширенную (двоичный вариант).
0
|
30.03.2018, 15:27 | |
Помогаю со студенческими работами здесь
7
Логическая ошибка в цикле for Логическая ошибка в консольном приложении Ошибка в рекурсии Ошибка в Рекурсии с++ Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |