我在递归方面遇到很多麻烦,包括其背后的逻辑。我知道原则上每当我们有一个循环时,都可以用对函数的调用来代替它。因此,我尝试了一个简单的示例(非常经典),在表中搜索最大值。这是Java迭代的经典示例:
static void rechercheMax(int unTab []) {
int max = unTab[0];
for (int j = 0; j < unTab.length; j++) {
if (unTab[j] > max) {
max = unTab[j];
}
}
System.out.println("the max is " + max);
}
如您所见,没有什么例外。另一方面,更难的是我制作的递归版本:
static int rechercheMaxRec(int[] unTab,int j,int max) {
if (j < unTab.length) {
if (unTab[j] > max) {
max = unTab[j];
j++;
rechercheMaxRec(unTab,j,max);
}else {
j++;
rechercheMaxRec(unTab,max);
}
}
return max;
}
我完全迷失了,这确实是一个“疯狂”的事情,就是一旦循环结束,计数器就朝相反的方向开始。老实说,我一点也不明白。
当我从主体调用函数时,操作如下
// the call from the main..... there is of course code preceding this:
int unTab [] = {7,22,11,34,17,52,26,13,40,20,103,10,5,16,8,4,2,1};
System.out.println ("The max in the recursive is" + searchMaxRec (unTab,0));
你能告诉我两件事吗?
- 为什么没有给出正确的结果,并且
- 为什么会朝相反的方向发展?
这种行为让我很不舒服;我担心我对递归一无所知。