我有一些递归算法的伪代码,可以找到数组中最小的数字。
这是算法。
Min(A[0..n - 1])
If n = 1 return A[0]
else
{
temp <-- Min(A[0..n - 2])
if temp <= A[n - 1]
return temp
else return A[n - 1]
}
我不理解这个伪代码的一部分是“temp&lt; - Min(A [0..n - 2])”行。具体为什么在递归调用中它是“n - 2”而不是“n - 1”?
我的另一个问题是如何在代码中实现该行。我正在使用Java。
提前感谢您的帮助。
答案 0 :(得分:5)
因为数组的索引从0到n-1(包括0和n-1)。你需要递归一个较小的元素的子数组,因此n-2。
答案 1 :(得分:1)
第一个问题:
因为您正在使用递归算法,为了解决问题,您首先必须以较小的尺寸解决相同的问题。在这个伪代码中,为了找到长度为n的数组的最小值,首先找到大小为n-1的相同数组的最小值,然后将最小值与第n个元素进行比较。你的数组从0到n-1索引(这将使它的长度= n)所以对于递归调用,你必须从索引0到n-2(n-1个元素)调用数组。
第二个问题: 这就是我在Java中实现代码的方式:
public class Minimum {
public Minimum(int[] A) {
findMin(A, 0, A.length-1);
}
public int findMin(int [] A, int start, int end){
if (start== end-1)
return A[0];
else{
int temp=findMin(A, start, end-1 );
if (temp<=A[end])
return temp;
else
return A[end];
}
}
}
答案 2 :(得分:0)
我的另一个问题是如何在代码中实现该行。
如果您使用的是数组。
// create an array with one less element.
A a2 = new A[a.length-1];
// copy the elements
System.arrayCopy(a,0,a2,0,a2.length);
如果您使用的是列表
List<A> a2 = a.subList(0, a.length-1);