繁体   English   中英

递归函数如何查找数组的最小元素?

[英]How does a recursive function to find the minimum element of an array work?

我有这种使用递归查找数组最小值的方法,我现在正在学习。

public class findMin {
    private static int findMin(int[] data, int index) {
    int min;
    if (index == data.length - 1)//base case
    return data[index];
    min = findMin(data, index + 1);
    if (min < data[index])
    return  min;
    else
    return data[index];

    } 
}

例如,我的数组是int[] numbers = {3, 15, 1, 9, 6, 12, 21, 17, 4}; 然后从索引0开始搜索

我的问题是该方法如何抛出整个数组? 我可以看到它检查了一下,但不是应该循环抛出整个数组吗?

您正在谈论两种选择

  • 使用循环遍历数组。
  • 使用递归的方式访问数组的每个元素而无需使用循环。

使用循环时,您会遇到类似

{initial data}
for({initial state} ; {stop condition} ; {incrementation} }

使用递归时,您会执行类似的操作。

// call the function the first time
method({initial data}, {initial state});


// inside the method it checks the condition
if ({condition})
     return {result}
else
     method({data}, {incrementation});

而且,如果您认为使递归看起来不必要地复杂且效率低下,那是因为Java基于过程语言,后者倾向于循环,而不是功能语言。 在函数式语言中,通常情况下递归更为优雅,而循环则相对困难。

我的问题是方法如何抛出整个数组?

每次该方法自身调用时,它都会递增索引,并且条件检查会在最后停止。

我可以看到它检查但它不应该处于循环中以抛出整个araay吗?

我不认为循环是解决问题的唯一方法。

注意:当有效支持递归时,尾递归优化可以将递归变成一个循环。 不幸的是,JVM没有这种优化。

在行中

min = findMin(data, index + 1);

该方法会自行调用。 这使得该方法实质上遍历了数组,因为每次该方法自身调用时,索引都会增加一个。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM