Java 求数组中数字的最小路径的递归
我有数组Java 求数组中数字的最小路径的递归,java,arrays,recursion,Java,Arrays,Recursion,我有数组[0,1,3,4,1]。使用此数组,我需要编写一个递归函数: 转到下一个元素,或 跳过下一个元素并转到它后面的元素(最多只能跳过1个元素) 条件是它必须是尽可能最小的数。这个问题的解决办法如下: 从0开始 跳过1并转到3 跳过4并转到1 添加未跳过的元素并返回它 我已经用它的基本情况启动了函数: private int play(int[] a, int first, int last) { int result = 0; // base case if (
[0,1,3,4,1]
。使用此数组,我需要编写一个递归函数:
- 从0开始
- 跳过
并转到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\u length-1
。注意,数组可以有任意数量的元素,所以如果我有数组[04235663445555113435455598344]
那么最低的总数将是591
请容忍我,我对这个递归的东西是新手。提前感谢我会这样做,您可以跟踪当前的索引,以及到该索引沿着路径的点为止的总和(因此总和将排除我们跳过的数字) 测试代码:
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
的小个子男人还有两个选择。他可以转到4
或1
。于是他们复制了自己,让小个子们通过所有的选择。我希望这一切在这一点上是有意义的。处理小人物复制到不同路径的代码是:play(a,index+1,sum),play(a,index+2,sum))
一个矮小的人一旦到达路的尽头会做什么?他必须告诉原来的小个子男人这条路有多远。代码是:if(index==a.length-1){returnsum;}
然而,最初的小矮人并不在乎这条路。他需要将其与另一条路径的对应项进行比较,以确定哪条路径更短。这由Math.Min
控制。这只是返回了两个小男人的较短距离。所以距离较短的小个子杀死了他的克隆人(:p),因为我们不喜欢这条路。最终,所有的小矮人都会互相残杀,只留下一个站着的小矮人,这是最短的距离。:) 因此,它假设返回的数字不能跳过所有加起来的数字?@3kings是的,这是正确的。因此,您可以跳过数字,但不能跳过一行中的多个数字?@tobias_k是的,函数不能跳过多个元素。如果您在正确的轨道上,您只需要确定递归调用使用的是first+1还是first+2(使用您提到的条件).提示:注意第一个+2会超过最后一个的情况。这个函数确实有效,但我有一个期中考试要处理。你能一步一步地解释这个函数吗?我真的很想了解递归是如何工作的。@user3170251是的。我会再添加一些文本。如果你不理解某个特定的部分,请告诉我。@user3170251让我知道这是否有意义。通过文本来教授这一点有点困难。:p这个例子很精彩。我肯定会把这个解释保存下来,以备将来可能的项目使用。快速提问代码方面,为什么要使用Integer.MAX_VALUE
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));
}