我对递归的想法很新,这实际上是我第一次尝试编写递归方法.
我试图实现一个递归函数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; }
}
使用静态变量来保持函数外的状态将是一个困难的来源.
在伪代码中递归实现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 } }
这里的关键是对Max()的递归调用,在这里你传递除第一个元素之外的所有东西,一个小于大小的东西.一般的想法是这个函数说"这个数据中的最大值是第一个元素,或者是数组其余部分中值的最大值,以较大者为准".
此实现不需要函数定义之外的静态数据.
递归实现的标志之一是所谓的"终止条件",它阻止递归永远继续(或者,直到你得到堆栈溢出).在上述情况下,测试size == 1
是终止条件.