Я и мой друг работали над задачей для школы. Мы просматриваем граф с помощью DFS и подсчитываем количество узлов в каждом заданном компоненте. Мы получаем очень разные результаты и определили, в чем разница.
При переходе к следующей рекурсии мой друг использует синтаксис
componentSize += DFS_visit(nextNodeToVisit);
тогда как я использую
componentSize = 1 + DFS_visit(nextNodeToVisit);
Я изначально думал, что это одно и то же, так в чем же разница? И какой из них следует использовать в нашем случае?
Они одинаковы только в том случае, если componentSize начинается с 1.
Оператор + имеет более высокий приоритет, чем оператор =. Поэтому ваше утверждение гласит thing = (1 + thing). В зависимости от значения thing (если !=1) будет получен «неожиданный» результат, отсюда и несоответствие.
And which one should be used in our case? ... очевидно тот, который дает правильные результаты
@jsotola Да, спасибо за ваш проницательный ответ. Правильный метод - всегда правильное решение...
@S3DEV и jonrsharpe Спасибо за хорошие объяснения!:D
просто обратите внимание, что a += b не совсем то же самое, что a = a + b - первый включает неявное приведение, а a оценивается только один раз! JLS 15.26.2. Составные операторы присваивания
На вторую часть вашего вопроса ("... какой из них следует использовать в нашем случае...") нельзя ответить, если вы не покажете нам, как вы используете эти строки. В этом отношении @jsotola прав. Но большая часть разработки программного обеспечения заключается в том, чтобы пробовать что-то, проверять правильность результатов и исправлять их, если они неверны. Ни один успешный разработчик программного обеспечения не пишет правильно всю программу перед ее запуском. Мы строим немного, тестируем, строим еще немного, тестируем и так далее. Так что комментарий jsotola о создании "... правильные результаты..." более проницателен, чем ваш саркастический ответ...
... отдает должное.




componentSize += DFS_visit(nextNodeToVisit);
означает
componentSize = componentSize + DFS_visit(nextNodeToVisit);
Сравните это с
componentSize = DFS_visit(nextNodeToVisit) + 1;
Увидеть разницу?
В целом a <op>= b означает примерно то же, что и a = a <op> b, где <op> — оператор. (Есть также приведение LHS к типу a.)
And which one should be used in our case?
Не понятно, что правильно. Нам нужно будет увидеть структуру данных и больше алгоритма.
a += bявляется синонимомa = a + b