Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 求数组中数字的最小路径的递归_Java_Arrays_Recursion - Fatal编程技术网

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]
。使用此数组,我需要编写一个递归函数:

  • 转到下一个元素,或
  • 跳过下一个元素并转到它后面的元素(最多只能跳过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));
    }