我有这种关于使用递归找到最小数组的方法,我现在正在学习。
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搜索。
我的问题是该方法如何抛出整个数组?我可以看到它检查但是不应该在循环中抛出整个数组?
答案 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);
该方法调用自身。这使得该方法基本上循环遍历数组,因为每次方法调用自身时,它都会将索引增加一个。