如果函数中只有一个递归调用,我可以很容易地理解递归。但是,当我在同一个函数中看到两个或多个递归调用时,我真的很困惑。例子:
int MaximumElement(int array[], int index, int n)
{
int maxval1, maxval2;
if ( n==1 ) return array[index];
maxval1 = MaximumElement(array, index, n/2);
maxval2 = MaximumElement(array, index+(n/2), n-(n/2));
if (maxval1 > maxval2)
return maxval1;
else
return maxval2;
}
我理解在每次递归调用期间 n 减半的一件事。我只是不明白下一个递归调用是如何工作的。它变得令人困惑,我的理解直到那一点崩溃并且我放弃了。如果有人可以用一个简洁的例子手动说明这一点,我将非常感激。我已经进行了编程,并打印了输出。但是,我不明白这背后的计算是如何工作的。这是我的理解,直到一切都化为乌有:
int a[] = {1,2,10,15,16,4,8}
初始调用:MaximumElement(a, 0, 7)
函数开始: 第一次调用:MaximumElement(a, 0, 7/2) n 现在变成 7/2 = 3
第二次调用:MaximumElement(2,0,3/2) n 现在变为 3/2 = 1
满足基本条件并且 max1 得到 a[0] = 1
这里是所有地狱都崩溃的地方:第二个递归调用从索引 0 开始,n = index + n/2 = 0 + 1/2 = 0?当我打印这些值时,程序在第二次调用时将 3 显示为 n 的值。
我已经进行了广泛的编程,但我真的对此做噩梦。非常感谢能帮我解决这个问题的人!!
那是上面的伪代码,但请参阅下面的我编写的 java 代码(如果您尝试运行它,它可能会让您更容易):
public int MAXIMUMELEMENT(int a[], int i, int n)
{
int max1, max2;
System.out.println("1: " + i + " 2: " + n);
if(n == 1)
{
System.out.println("Returning " + a[i]);
return a[i];
}
max1 = MAXIMUMELEMENT(a, i, n/2);
System.out.println("Index: "+i+" "+" Variable: "+max1+" n value: "+n);
max2 = MAXIMUMELEMENT(a, i + (n/2), n - (n/2));
System.out.println("Index2: " + i + " " + "Variable2: " + max2);
if(max1 > max2)
{
System.out.println("Returning.... " + max1 );
return max1;
}
else
{
System.out.println("Returning.... " + max2);
return max2;
}
}