Упрощение оператора if
У меня есть рабочее решение для задачи, найденной здесь. Написав его, я заметил, что у меня есть точно такое же утверждение в обеих частях if / else:
public boolean groupSum6(int start, int[] nums, int target) {
if(start >= nums.length) return target == 0;
int next = start + 1;
int cur = nums[start];
if(cur == 6) return groupSum6(next, nums, target - cur);
return groupSum6(next, nums, target - cur) || groupSum6(next, nums, target);
}
После небольшого переоснащения я смог "упростить" задачу до следующего:
public boolean groupSum6(int start, int[] nums, int target) {
if(start >= nums.length) return target == 0;
int next = start + 1;
int cur = nums[start];
if(cur != 6) {
boolean success = groupSum6(next, nums, target);
if(success) return true;
}
return groupSum6(next, nums, target - cur);
}
Я определенно предпочитаю второе решение, хотя оно немного более многословно. Мой вопрос в том, есть ли способ упростить это еще больше? Мне кажется, что-то не так с утверждением if, которое возвращает true, но я мог бы просто закончите анализировать проблему. Я прошу только об улучшении моих способностей к упрощению логики, а не потому, что считаю это необходимым.2 ответа:
Здесь это более упрощенно.
public boolean groupSum6(int start, int[] nums, int target) { if(start >= nums.length) return target == 0; int next = start + 1; int cur = nums[start]; boolean minusCur = groupSum6(next, nums, target - cur); return (cur == 6) ? minusCur : (minusCur || groupSum6(next, nums, target)); }
Строк я добавил будет проверять, если шавка == 6 он вернется minusCur и если не вернется
(minusCur || groupSum6(next, nums, target)));