2014-06-07 103 views
-2

给定一个int数组,是否可以将int分成两组,以便两组的和是相同的。每个int必须位于一个组中或另一个组中。编写一个递归辅助方法,它接受你喜欢的任何参数,并从splitArray()对你的递归助手进行初始调用。 (不需要循环)数组递归困惑(java)

这是编码蝙蝠的一个问题,我试图弄清楚。我被困住了,所以我找到了一个解决方案,但是我对一行的目的感到困惑,并且完全被最终的return语句所做的事迷惑。谢谢你的帮助!

public boolean splitArray(int[] nums) { 

return splitArrayHelper(nums, 0, new int[nums.length], 0, 0, new int[nums.length], 0, 0); 
} 

private boolean splitArrayHelper(int[] nums, int n, int[] split1, int s1, int t1, int[] split2, int s2, int t2) { 

if (n == nums.length) 
return t1 == t2; //returns true or false 

split2[s2] = split1[s1] = nums[n]; // What is the purpose of this line? 

return 
splitArrayHelper(nums, n + 1, split1, s1 + 1, t1 + nums[n], split2, s2, t2) || 
splitArrayHelper(nums, n + 1, split1, s1, t1, split2, s2 + 1, t2 + nums[n]); 
} //I don't know what this return statement is doing. How is the or statement decided? 
+0

的代码是让人有些困惑。变量命名不是很清楚。 但是,我可以看到算法使用递归来解决这个问题。或者“||”在简单的return语句中或递归调用返回的两个布尔值。 – vda8888

+0

对不起。你对于退货的解释并不完全清楚。 – user3713351

回答

1

的想法是,我们必须将原来的数组拆分成2个数组,称为A和B,所以对于原始数组中每一个数字,这个数字将要么属于A或B.我们保持A(group1Total)和B(group2Total)之和的总和。

我会写我的助手像下面

private static boolean splitHelp(int[] nums, int elementCount, int group1Total, int group2Total) { 
      if (elementCount == nums.length) { 
       return group1Total == group2Total; 
      } 

      return splitHelp(nums, elementCount + 1, group1Total+ nums[n], group2Total) //The element belongs to array A 
|| splitHelp(nums, n + 1, group1Total, group2Total+ nums[n]) //or the element belongs to array B; 
     } 
+0

如何做出决定?我看到它在第一个数组或第二个数组中,但实际的标准在哪里? – user3713351

+0

为了想象这一点,在每一步中,我们都有一个数字nums [n]和两个总和:group1Total或group2Total。所以我们有两种可能:将nums [n]放入group1Total,或将nums [n]放入group2Total。对于每种可能性,我们使用递归重复数组中下一个数字的过程(nums [n + 1])。换句话说,我们尝试了所有2^n种可能性。 – vda8888

+0

所以这给了我们两种可能性,直到在if语句中调用最终返回语句为止? – user3713351