当前位置: 首页 > 知识库问答 >
问题:

陷入递归-找到最低的差异

微生德泽
2023-03-14

我得到了以下练习:给定一个int数组,返回递归数组中两组不同数字之间的最低绝对差异。例如:如果你有以下数组:{5,4,2}最低差异是1,因为如果你把它拆分为2组:{5},{4,2}你得到: Math.abs(5-6)=1。另一个例子:如果你有以下数组:{4,3,2,1}最低差异是0,因为如果你把它分成两个组:{4,1},{3,2}你得到:Math.abs(5-5)=0。这必须是递归的,你可以创建尽可能多的方法。方法签名是:公共静态int minDiff(int[]arr)

我得到的是:

public static int minDiff(int[] arr){
    return minDiff(arr,0,0,0,arr[0]);
}
private static int minDiff(int[] arr,int index,int groupa, int groupb, int diff){
    if(index>=arr.length || arr.length-1-index<0 || (index==arr.length-1-index) ) return diff;
    int dif1=minDiff(arr,index+1,groupa+arr[index], groupb, diff);
    int dif2=minDiff(arr,index+1,groupa, groupb+arr[index], diff);
    if(Math.abs(dif1-dif2)<diff){
        diff=Math.abs(dif1-dif2);
    }
    return diff;

}

请告知

共有1个答案

楚德辉
2023-03-14

看看这个片段

public static void main(String[] args)
{
    System.out.println(minDiff(new int[] { 5, 2, 4 })); // 1
    System.out.println(minDiff(new int[] { 5, 4, 2 })); // 1
    System.out.println(minDiff(new int[] { 1, 2, 7, 17, 6 })); // 1
    System.out.println(minDiff(new int[] { 4, 3, 2, 1 })); // 0

}

public static int minDiff(int[] arr)
{
    return minDiff(arr, 0, 0, 0);
}

private static int minDiff(int[] arr, int sumGroupA, int sumGroupB, int i)
{
    if (i == arr.length) // in case we are out of boundaries return the absolute value between the two groups
        return Math.abs(sumGroupA - sumGroupB);

    int r1 = minDiff(arr, sumGroupA + arr[i], sumGroupB, i + 1); // add to group 1
    int r2 = minDiff(arr, sumGroupA, sumGroupB + arr[i], i + 1); // add to group 2 instead

    return Math.min(r1, r2);
}
 类似资料:
  • 我正在学习c并编写一个递归函数来查找数组中的最小值。该函数被赋予一个整数数组和两个索引:low和high(low 这是一项家庭作业,我花了几个小时研究如何找到工作。程序返回“线程断点”,我感觉我在正确的轨道上,但可能缺少一些东西。如果有人能给我指出正确的方向,或者给我一个提示,告诉我我做错了什么。谢谢

  • 我试图通过自顶向下递归实现二叉树最低公共祖先(LCA)问题的解决方案。 我使用的方法是: 想法:找到在任一子树中有一个所需节点的节点,而另一个所需节点是相反的子树。 以下是确切的实现: 例如: 这将返回树的根作为结果。结果=TreeNode(2)

  • 我试图递归地在二叉树中找到最小值(不是二叉查找树)。让我困惑的是基本情况。如果TreeNode t为空,返回什么?因为我将使用返回的值将其与当前的最小值进行比较(我认为),我相信我返回的内容很重要。

  • 我正在尝试使用递归函数打印列表,该列表具有由我的以下代码产生的列表的最大长度: 我需要将下面的输出传递给找到最大长度的递归函数: 基于我对这个问题答案的理解,我尝试使用以下代码来实现它,但我无法很好地实现递归部分。以下是我的尝试: 注:我需要使用递归来解决最长递增序列的问题。

  • 我的角度控制器中有两个函数,分别是loadForm和SaveForm。我想找出我的表单数组和我的新数组之间的差异。所以我使用了object Diff插件。这是我的数组预览,这是我的DiffObject结果预览:已更改数组 我必须通过递归函数只保存对象更改值。将值放入新数组。

  • 输出如下