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

时间:2014-01-13 20:17:34

标签: java arrays recursion

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

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搜索。

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

2 个答案:

答案 0 :(得分:2)

您有两种选择

  • 使用循环来完成数组。
  • 以不使用循环访问数组的每个元素的方式使用递归。

使用循环时,您可以使用

{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没有这种优化。

答案 1 :(得分:0)

在第

min = findMin(data, index + 1);

该方法调用自身。这使得该方法基本上循环遍历数组,因为每次方法调用自身时,它都会将索引增加一个。