Я немного запутался, почему мое решение, приведенное ниже, не дает правильного ответа. Я немного покопался и думаю, это связано с тем, как работают звонки? Я думал, что оба пути были одинаковыми, но это не так, но я не совсем понимаю, что мой возвращается неправильно. Это исследование, которое я провел до этого: https://softwareengineering.stackexchange.com/questions/333247/why-does-recursion-return-the-first-call-in-the-stack-and-not-the-last
Проблема:
Учитывая массив целых, можно ли разделить целые на две группы, так что сумма двух групп одинакова, с этими ограничениями: все значения, кратные 5, должны быть в одной группе, и все значения, кратные 3 (а не кратные 5), должны быть в другой. (Никаких циклов не требуется.)
Пример:
split53 ([1, 1]) → true
split53 ([1, 1, 1]) → false
split53 ([2, 4, 2]) → true
Мой ответ:
public boolean split53Helper(int start, int [] nums, int group3, int group5){
if(start >= nums.length){
return group3 == group5;
}
if(nums[start] % 3 == 0 ){
if (split53Helper(start + 1, nums, group3 + nums[start], group5)){
return true;
}
}
if(nums[start] % 5 == 0){
if (split53Helper(start + 1, nums, group3, group5 + nums[start])){
return true;
}
}
if(split53Helper(start+1, nums, group3 + nums[start], group5))
return true;
if(split53Helper(start+1, nums, group3, group5 + nums[start]))
return true;
return false;
}
Правильное решение:
public boolean split53(int[] nums) {
return split53Helper(0, nums, 0, 0);
}
public boolean split53Helper(int start, int[] nums, int mult5, int mult3) {
if(start >= nums.length)
return mult5 == mult3;
if(nums[start] % 5 == 0)
return split53Helper(start+1, nums, mult5 + nums[start], mult3);
if(nums[start] % 3 == 0)
return split53Helper(start+1, nums, mult5, mult3 + nums[start]);
if(split53Helper(start+1, nums, mult5 + nums[start], mult3))
return true;
if(split53Helper(start+1, nums, mult5, mult3 + nums[start]))
return true;
return false;
}
Мой код не возвращая последний звонок? Если так, когда я использовал бы один метод возвращения по другому? Если уже есть подробное объяснение, просто дайте мне знать. Я думал, что понимаю, как работают стеки и вызовы функций, но теперь я волнуюсь, что двигаюсь в неправильном направлении.