我有数组[0,1,3,4,1]
。有了这个数组,我需要编写一个递归函数:
条件是它需要尽可能小的数量。该问题的解决方案如下:
1
并转到3
4
并转到1
我已经用它的基本情况启动了这个函数:
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 = 0
和last = array_length -1
。注意,数组可以有任意数量的元素,所以如果我有数组[0 4 23 566 34 45 555 11 34 35 45 65 55 98 344]
,最低总数将是591。
请忍受我,我是这个递归的新手。提前致谢
答案 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
的小人还有两个选择。他可以转到3
或4
。前往路径3
的小人物还有2个选项。他可以前往4
或1
。因此,他们复制自己,并通过所有选项发送小人物。我希望在这一点上这一切都有意义。处理小人到不同路径的重复的代码是:play(a, index+1, sum), play(a, index+2, sum))
一旦小人到达路径尽头,他会怎么做?他必须告诉原来的小人这条道路有多远。代码是:if (index == a.length-1){return sum;}
Math.Min
控制。这只是返回2个小男人的较短距离。因此,距离较短的小男人会杀死他的克隆(:p),因为我们不喜欢这条路。最终所有的小男人都会互相残杀,只留下一个小人站立,这是最短的距离。 :)