|
-21 / 3 / 0
Регистрация: 01.09.2017
Сообщений: 21
|
||||||
Логическая ошибка при рекурсии29.03.2018, 19:48. Показов 1404. Ответов 6
Метки нет (Все метки)
Решил задачу в теме про рекурсию. Использован алгоритм Евклида. Условие:
Напишите рекурсивную функцию вычисления наибольшего общего делителя двух положительных целых чисел (Greatest Common Divisor, GCD). Для этого воспользуйтесь следующими свойствами. Требования к реализации: в данном задании запрещено пользоваться циклами. Вы можете заводить любые вспомогательные функции, если они вам нужны. Проблема в том, что мой рекурсивный алгоритм в функции, которая вызывает себя, работает корректно ровно до последней итерации(когда одно из значений становится равно 0). А конкретно часть (a = m) и (b = m) попросту игнорируется. И дело даже не в проверке на равенство нулю перед алгоритмом, потому что когда управление передаётся строке 9, условия как раз выполняются. Я проверял, убирал проверку. Вывод в строке 10 добавлен только чтобы показать какие значения принимают аргументы функции на каждом этапе итерации. По логике вещей значение b в последней итерации должно было ровняться 0. Следовательно возвращать я должен бы то значение, которое больше, а не то которое меньше. Почему так происходит? Где ошибка? Мой код
0
|
||||||
| 29.03.2018, 19:48 | |
|
Ответы с готовыми решениями:
6
Логическая ошибка логическая ошибка!! |
|
475 / 427 / 290
Регистрация: 10.03.2015
Сообщений: 1,782
|
|||
| 29.03.2018, 20:00 | |||
|
0
|
|||
|
-21 / 3 / 0
Регистрация: 01.09.2017
Сообщений: 21
|
||||||
| 30.03.2018, 15:06 [ТС] | ||||||
|
Уважаемые знатоки, повторяю ещё раз. Проверка тут не при чём. Для примера, скомпилируйте код без строк 7 и 12, вывод не изменится, если не использовать как аргумент 0, разумеется(тогда программа крашится, потому что происходит деление на 0 в алгоритме). Если вы не знаете, просто не сталкивались с подобной ошибкой, или вам лень думать, то пожалуйста не отвечайте в этой теме
Мы не выйдем в else по той простой причине, что в последнем вызове функции gcd m будет равно 0 и вместо очередного вызова функции gcd она вернёт значение в вызывающую функцию gcd, а та в предыдущую, и так далее пока первая вызванная gcd не вернёт значение в main, а та выведет его на экран
0
|
||||||
|
677 / 479 / 216
Регистрация: 06.09.2013
Сообщений: 1,312
|
|
| 30.03.2018, 15:12 | |
|
FeewrE, а зачем вы такую, извините, ерунду пишете
(a > b) ? ((m = a % b) && (a = m)) : ((m = b % a) && (b = m)); возможно, у вас он вычисляет первый операнд логического И, он - ноль, второй считать не надо, оптимизация, однако. Кто вас научил так писать? Пишите обычный if.
0
|
|
|
475 / 427 / 290
Регистрация: 10.03.2015
Сообщений: 1,782
|
||||||||
| 30.03.2018, 15:19 | ||||||||
|
По правде говоря, сама конструкция такого присвоения весьма чудная.
0
|
||||||||
|
1272 / 1029 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
|
||
| 30.03.2018, 15:22 | ||
Сообщение было отмечено FeewrE как решение
Решение
0
|
||
|
475 / 427 / 290
Регистрация: 10.03.2015
Сообщений: 1,782
|
||||||
| 30.03.2018, 15:27 | ||||||
|
likehood, да, причем если нормально писать возвращение из рекурсии, в какой-то момент всплывает
![]() Добавлено через 3 минуты А вообще, используйте нормальную версию рекурсивной функции, или расширенную (двоичный вариант).
0
|
||||||
| 30.03.2018, 15:27 | |
|
Помогаю со студенческими работами здесь
7
Неведомая логическая ошибка (С++) Логическая ошибка в цикле for Логическая ошибка в консольном приложении Ошибка в рекурсии Ошибка в Рекурсии с++ Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Символьное дифференцирование
igorrr37 13.02.2026
/ *
Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет
значение производной при заданном х
Логарифм записывается как: (x-2)log(x^2+2) -. . .
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу,
и светлой Луне.
В мире
покоя нет
и люди
не могут жить в тишине.
А жить им немного лет.
|
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила»
«Время-Деньги»
«Деньги -Пуля»
|
|
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога
Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
|
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
|