用于查找数组中最小数字路径的递归

时间:2015-10-21 20:03:51

标签: java arrays recursion

我有数组[0,1,3,4,1]。有了这个数组,我需要编写一个递归函数:

  1. 转到下一个元素,或
  2. 跳过下一个元素并转到后一个元素(最多只能跳过1个元素)
  3. 条件是它需要尽可能小的数量。该问题的解决方案如下:

    • 从0开始
    • 跳过1并转到3
    • 跳过4并转到1
    • 添加unskipped元素并将其返回

    我已经用它的基本情况启动了这个函数:

    private int play(int[] a, int first, int last) {
        int result = 0;
    
        // base case
        if (first == last){
            return a[first];
        }
        else{
            //result = play(a,first+1,last);
            //System.out.println(result);
        }
        return result;
    
    }
    

    first = 0last = array_length -1。注意,数组可以有任意数量的元素,所以如果我有数组[0 4 23 566 34 45 555 11 34 35 45 65 55 98 344],最低总数将是591。

    请忍受我,我是这个递归的新手。提前致谢

1 个答案:

答案 0 :(得分:2)

我会做这样的事情,你跟踪当前正在使用的当前索引以及到目前为止该路径之后的索引点的总和(因此总和将排除我们跳过的数字)。

public static int play(int[] a, int index, int sum){
    if (index>=a.length) return Integer.MAX_VALUE;  //Path went over last index. Invalid Path. 
    sum += a[index];  //Add on to the sum of the index you are currently on
    if (index == a.length-1){
        return sum;  //If we are at last element, return sum of the path traveled
    }else{
        return Math.min(play(a, index+1, sum), play(a, index+2, sum)); //Continue onto path checking both options
    }
}

测试代码:

public static void main(String args[]) {
    int[] a = new int[]{0, 4, 23, 566, 34, 45, 555, 11, 34, 35, 45, 65, 55, 98, 344};
    System.out.println(play(a, 0, 0));
}

输出:591

希望这会有所帮助。

编辑: 好的,删除所有代码,只是逻辑地考虑这个。我喜欢考虑递归(尤其是路径)的方式是我发送个体小人物,并且在每次递归之后我将复制那些小人物以采取不同的路径。在本例中,让我们使用较小的数组[0,1,3,4,1]

我们从一个小男人开始。他从0开始。他有两个选择。第一个选项是转到1,第二个选项是转到3。我们需要走下这两条道路,因为我们不确定未来会发生什么。小男人重复自己将一个人送到1,另一个送到3

现在,前往路径1的小人还有两个选择。他可以转到34。前往路径3的小人物还有2个选项。他可以前往41。因此,他们复制自己,并通过所有选项发送小人物。我希望在这一点上这一切都有意义。处理小人到不同路径的重复的代码是:play(a, index+1, sum), play(a, index+2, sum))

一旦小人到达路径尽头,他会怎么做?他必须告诉原来的小人这条道路有多远。代码是:if (index == a.length-1){return sum;}

然而,原来的小男人并不关心那条道路。他需要将它与另一条路径上的对应物进行比较,看看哪一条较短。这由Math.Min控制。这只是返回2个小男人的较短距离。因此,距离较短的小男人会杀死他的克隆(:p),因为我们不喜欢这条路。最终所有的小男人都会互相残杀,只留下一个小人站立,这是最短的距离。 :)