我对递归的想法很新,这实际上是我第一次尝试编写递归方法.
我试图实现一个递归函数Max,它传递一个数组,以及一个保存数组大小的变量,以便打印出最大的元素.
它有效,但感觉不对劲!
我也注意到我似乎比一般的同学更多地使用静态修饰符......
任何人都可以提供任何一般提示以及如何改进我的代码的反馈?
public class RecursiveTry{
static int[] n = new int[] {1,2,4,3,3,32,100};
static int current = 0;
static int maxValue = 0;
static int SIZE = n.length;
public static void main(String[] args){
System.out.println(Max(n, SIZE));
}
public static int Max(int[] n, int SIZE) {
if(current <= SIZE - 1){
if (maxValue <= n[current]) {
maxValue = n[current];
current++;
Max(n, SIZE);
}
else {
current++;
Max(n, SIZE);
}
}
return maxValue;
}
Run Code Online (Sandbox Code Playgroud)
}
使用静态变量来保持函数外的状态将是一个困难的来源.
在伪代码中递归实现max()函数的示例可能是:
function Max(data, size) {
assert(size > 0)
if (size == 1) {
return data[0]
}
maxtail = Max(data[1..size], size-1)
if (data[0] > maxtail) {
return data[0]
} else {
return maxtail
}
}
Run Code Online (Sandbox Code Playgroud)
这里的关键是对Max()的递归调用,在这里你传递除第一个元素之外的所有东西,一个小于大小的东西.一般的想法是这个函数说"这个数据中的最大值是第一个元素,或者是数组其余部分中值的最大值,以较大者为准".
此实现不需要函数定义之外的静态数据.
递归实现的标志之一是所谓的"终止条件",它阻止递归永远继续(或者,直到你得到堆栈溢出).在上述情况下,测试size == 1是终止条件.