我需要一些帮助才能理解下面找到数组中最小数字的程序,我理解在递归中你应该在一个结束递归的基本情况下划分问题,然后分成更小的步骤最终成长为最初的基础案例。
据我所知,只要索引到达数组中的最终位置,就会满足基本情况。但是,我真的不明白在下面的程序中,该方法会让自己回过头来继续推进整个阵列。
为什么它会继续检查完整数组的值而不是在检查第一个值后停止?
public static double min(double[] elements, int index) {
if (index == elements.length - 1) {
return elements[index];
}
double val = min(elements, index + 1);
if (elements[index] < val)
return elements[index];
else
return val;
}
答案 0 :(得分:2)
if (elements[index] < val)
return elements[index];
你问为什么第一次没有回到那里,对吧?嗯,确实如此,但这很好,因为它已经进行了递归调用 - 它就是这样做的:
double val = min(elements, index + 1);
所以它会到达那个调用,下降一个级别,并反复重复直到达到基本情况终止条件:
if (index == elements.length - 1) {
return elements[index];
}
然后当它回到调用堆栈时,它将进行实际比较并找到最少的。
有意义吗?
答案 1 :(得分:-2)
使用这段java代码可以让它更容易理解:
public static double min(double[] elements, int index) {
if (index == elements.length - 1) {
System.out.println(elements[index] + " returned from recursion");
return elements[index];
}
double val = min(elements, index + 1);
if (elements[index] < val) {
System.out.println(elements[index] + " is less than " + val);
System.out.println(elements[index] + " returned from recursion");
return elements[index];
}
else {
System.out.println(val + " is less than " + elements[index]);
System.out.println(val + " returned from recursion");
return val;
}
}
致电min(array_from_which_to_find_min, 0);