И f
, и g
- простые рекурсивные функции, f (A, i, mid) - это просто вызов исходной функции f (A, i, j). Возьмите некоторые значения, такие как f (A, 0,3) и A = [4,2,3,1] и аккуратно go через код.
Я просто преобразовал его в java, я нашел следующий вывод:
Ввод:
int[] A = { 4, 2, 3, 1 };
f(A, 0, 3);
Выход:
f: 0, 3
f: 0, 1
f: 0, 0
f: 1, 1
g: 0, 1
f: 2, 3
f: 2, 2
f: 3, 3
g: 2, 3
g: 0, 3
g: 0, 1
g: 2, 3
g: 1, 2
Если вам нужен полный код, вот он, вы можете играть с любым входом, который вы как,
public class SomeRecursion
{
static void f(int[] A, int i, int j)
{
System.out.println("f: " + i + ", " + j);
int n = j - i + 1;
int mid = (i + j) / 2;
if (n > 1)
{
f(A, i, mid);
f(A, mid + 1, j);
g(A, i, j);
}
}
static void g(int[] A, int i, int j)
{
System.out.println("g: " + i + ", " + j);
int n = j - i + 1;
if (n == 2)
{
if (A[i] > A[j])
{
// swap A[i] and A[j];
int t = A[i];
A[i] = A[j];
A[j] = t;
}
}
else
{
for (int k = 0; k < n / 4; k++)
{ // swap 2nd and 3rd quarters
// swap A[i + n / 4 + k] with A[i + n / 2 + k];
int t = A[i + n / 4 + k];
A[i + n / 4 + k] = A[i + n / 2 + k];
A[i + n / 2 + k] = t;
}
g(A, i, i + n / 2 - 1); // recurse on 1st and 2nd quarters
g(A, i + n / 2, j); // recurse on 3rd and 4th quarters
g(A, i + n / 4, i + 3 * n / 4 - 1); // recurse on 2nd and 3rd quarters
}
}
public static void main(String[] args)
{
int[] A = { 4, 2, 3, 1 };
f(A, 0, 3);
}
}