【问题标题】:Confused by Return in Array Recursion (java)对数组递归中的返回感到困惑(java)
【发布时间】:2014-07-28 21:17:57
【问题描述】:

给定一个整数数组,是否可以将整数分成两组,使两组的和相同。每个 int 必须在一个组中。编写一个递归帮助器方法,它接受你喜欢的任何参数,并从 splitArray() 对你的递归帮助器进行初始调用。 (不需要循环。)

这是我试图解决的编码问题。我真的被卡住了,所以我找到了一个解决方案,但我对一行的目的感到困惑,对最终的 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?

【问题讨论】:

  • 代码真的很混乱。变量命名不是很清楚。但是,我可以看到该算法正在使用递归来解决这个问题。或“||”在 return 语句中简单地或递归调用返回的两个布尔值。
  • 对不起。你对退货的解释我并不完全清楚。

标签: java arrays boolean return


【解决方案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;
        }

【讨论】:

  • 如何做出决定?我看到它在第一个数组或第二个数组中,但实际标准在哪里?
  • 为了可视化这一点,在每一步,我们都有一个数字 nums[n] 和两个总和:group1Total 或 group2Total。所以我们有两种可能:要么将 nums[n] 放入 group1Total,要么将 nums[n] 放入 group2Total。对于每种可能性,我们使用递归对数组中的下一个数字 (nums[n+1]) 重复该过程。换句话说,我们尝试了所有 2^n 种可能性。
  • 所以这给了我们两种可能性,直到在 if 语句中调用最后的 return 语句?
  • 是的,在我们到达 if 语句之前,这两种可能性都在堆栈中
  • 跟踪堆栈是理解递归算法的一种低效方式。您只需要了解基本步骤和递归调用。试图理解堆栈只会使问题变得复杂。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-15
  • 1970-01-01
  • 2021-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-09
相关资源
最近更新 更多